2010-06-22 2 views
2

Je voudrais savoir comment gérer les transactions imbriquées, par ex. Entre on commence et commettre, j'en ai un autre commencer et commettre. La raison pour laquelle je vous demande est que dans mon projet ApplicationServices j'ai des services qui dépendent d'autres services. Et une méthode d'un service parent commence une transaction et selon une certaine logique, il peut devoir appeler l'une des méthodes des services enfants dépendants, que également à son tour effectuer begin et valider. La méthode des services de l'enfant sont étant également utilisé indépendamment aussi bien directement des contrôleurs, par conséquent je dois utiliser begin et commit dans les services enfants.Traiter les transactions imbriquées à l'aide de NHibernate dans l'architecture Sharp

Donc en bref, au fond, je finira par avoir quelque chose comme ça

using(Repository1.DbContext.BeginTransaction()) 
    { 
     try 
     { 
     ..... 
     ..... 
     using(Repository2.DbContext.BeginTransaction()) 
     { 
      try 
      { 
       ..... 
       ..... 
       Repository2.DbContext.CommitTransaction() 
      } 
      catch 
      { 
       Repository2.DbContext.RollBack(); 
       throw; 
      } 
     } 
     Repository1.DbContext.CommitTransaction() 
     } 
     catch 
     { 
     Repository1.DbContext.RollBack(); 
     throw; 
     } 
    } 

Il y sont imbriquées commence et engage. Je voudrais savoir

-quel serait le comportement, lorsque le Repository2 imbriqué obtient validé avec succès mais le Repository parent1 est annulé?

Comment puis-je contrôler ce comportement dans le code, par ex.

-si je ne souhaite pas que la transaction enfant fasse partie de la transaction parente . -comment déterminer si une transaction est déjà en cours avant créer une transaction enfant

ou s'il existe une autre solution élégante à ce problème?

Merci Nabeel

Répondre

3

NHibernate ne prend pas en charge les transactions imbriquées. Le DbContext est-il le même pour Repository1 et Repository2? Si c'est le cas, ils peuvent participer à la même transaction. Sinon, vous devrez diviser les transactions en deux méthodes ou regarder le System.Transactions namespace.

+0

Oui la DBContect est identique pour les deux référentiels et après le profilage dans NHibernate Profiler, il se avère que NHibernate ne commence pas une nouvelle transaction pour le dépôt interne. Et oui diviser la transaction en deux méthodes, c'est exactement ce que je fais pour le moment. Mais je pensais qu'il pourrait y avoir une meilleure façon de le faire. J'ai déjà utilisé TransactionScope dans le passé, donc je pense essayer car j'utilise une seule base de données SQL 2005 dans mon application. – nabeelfarid

+0

J'ai trouvé cet autre article sur SO pour être utile aussi. http://stackoverflow.com/questions/646318/nhibernate-with-transactionscope – nabeelfarid

0

Si vous placez vos limites de transaction au niveau de votre contrôleur, je dirais que vous n'avez pas besoin de transactions imbriquées.

+0

bien il y a aussi un client winform.Et je pense garder le code de gestion des transactions dans mon projet ApplicationServices au lieu du projet Controllers, de cette façon je n'aurai plus à gérer le code de manipulation des transactions dans Winform. – nabeelfarid

Questions connexes