2010-10-05 21 views
8

ce code me donne l'erreur: la transaction a avorté. si je retire 1 transaction imbriquée qu'elle ne jette pas2 transactionnel imbriqué transactionScope donne: la transaction a avorté

using(var scope = new TransactionScope()) 
    { 
     repo.Insert(new Foo {Fname = "aaaa"}); 
     using(var s = new TransactionScope()) 
     { 
      repo.Insert(new Foo { Fname = "aaaa" }); 

      //if I remove this transaction it is not going to throw exception 
      using (var aaa = new TransactionScope()) 
      { 
       repo.Insert(new Foo { Fname = "aaaa" }); 
      } 

      using(var ssa = new TransactionScope()) 
      { 
       repo.Insert(new Foo { Fname = "aaaa" }); 
      } 
     } 
    } 

Répondre

12

Quel énoncé ne jette l'erreur? Je suppose que c'est le dernier repo.Insert.

Puisque vous n'appelez pas scope.Complete(), la transaction est annulée (annulée) lorsque aaa est éliminé.
Généralement, l'annulation de transaction est considérée comme une erreur, de sorte que toutes les transactions de niveau supérieur deviennent également non validables (ou sont immédiatement annulées).
Donc, pour la dernière repo.Insert, il n'y a pas de transaction valide à utiliser - c'est pourquoi il déclenche une exception.

2

oui, cela fonctionnera. Vous avez oublié d'inclure scope.Complete(); à la fin

+0

@ user281180 Je l'ai fait exprès, je ne veux pas le commettre, et cela me jette une erreur – Omu

3

Vous pourriez avoir besoin de spécifier le TransactionScopeOption comme dans cet exemple de MSDN:

using(TransactionScope scope1 = new TransactionScope()) 
//Default is Required 
{ 
    using(TransactionScope scope2 = new 
     TransactionScope(TransactionScopeOption.Required)) 
    { 
    ... 
    } 

    using(TransactionScope scope3 = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
    ... 
    } 

    using(TransactionScope scope4 = new 
     TransactionScope(TransactionScopeOption.Suppress)) 
    { 
    ... 
    } 
} 

Ref: http://msdn.microsoft.com/en-us/library/ms172152.aspx