2010-09-02 4 views
0

J'ai une question. Imaginez que vous ayez un objet que vous voudriez sauvegarder dans une transaction, l'objet ayant des collections d'autres objets etc. C'est donc un objet plus "complexe".Niveau de transaction Nhibernate pendant l'aide persistante

Quoi qu'il en soit, nous sauvegardons parfois des objets comme ça, mais en attendant, nous utilisons un autre thread qui lit parfois les données et les synchronise avec notre serveur central. Cependant, nous avons remarqué des problèmes que, dans certains cas, les objets sont synchronisés sans tous les objets de collection. Comme cela ne se produit que de temps en temps, nous avons pensé qu'il pourrait s'agir du niveau d'isolation de la transaction. Peut-être que le thread de synchronisation lit les données avant que la transaction ne soit effectuée en conservant tous les objets, ne lisant ainsi que la moitié des données nécessaires et en les envoyant. Parce que nous savons tous que les données des clients sont toutes enregistrées, tout le temps, c'est juste que parfois, il ne balise pas lorsqu'il est envoyé à nous.

Donc nous voudrions une sorte de verrou je suppose, je ne sais rien de ces verrous. Lequel devrions-nous utiliser?

Dans ce cas, aucune source externe ne travaille vers la base de données, puisqu'il s'agit d'une application WPF sur le client d'un client.

Toute aide serait appréciée!

Cordialement, E.

Répondre

1

Chaque base de données prend en charge un ensemble de normes isolation levels. Tout ceci est destiné à empêcher à un certain niveau que vous lisiez des données modifiées dans une autre transaction. Je vous suggère de lire d'abord ce que signifient ces niveaux d'isolement.

Dans votre situation spécifique, je suggère que pour la transaction qui lit les données, vous utilisez au moins un niveau d'isolement de ReadCommitted. Dans le code, cela ressemblerait à ceci:

using (var transactionScope = new TransactionScope(TransactionScopeOption.Required, 
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) 
{ 
    // Read the data you want from the database. 
    ... 
    transactionScope.Complete(); 
    // Return the data. 
} 

L'utilisation d'un TransactionScope avec IsolationLevel.ReadCommitted empêche de lire des données qui n'a pas encore été commis par une autre transaction.

Le code qui écrit des données dans la base de données doit également être placé dans une transaction. Tant que vous n'écrivez que des données dans cette transaction, le niveau d'isolation de cette transaction n'a pas d'importance. Cela garantit l'atomicité de vos mises à jour: soit toutes les mises à jour réussissent, soit aucune d'entre elles. Cela empêche également une autre transaction de lire une mise à jour partielle.

+0

Merci beaucoup! Exactement ce que j'avais besoin de savoir. :) – Einarsson

Questions connexes