2010-10-05 14 views
8

questo codice mi dà l'errore: la transazione è stata interrotta. se rimuovo 1 transazione nidificata di quanto non gettaTransazione nidificata di pari livello 2 Scope dà: la transazione ha annullato

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" }); 
      } 
     } 
    } 

risposta

12

Che affermazione non gettare l'errore? Suppongo che sia l'ultimo repo.Insert.

Poiché non si chiama scope.Complete(), la transazione viene ripristinata (interrotta) quando aaa viene eliminata.
In genere, il rollback della transazione viene considerato un errore, pertanto tutte le transazioni di livello superiore diventano non più condivisibili (o vengono immediatamente ripristinate).
Quindi, per l'ultimo repo.Insert non esiste alcuna transazione valida da utilizzare, ecco perché genera un'eccezione.

2

sì, funzionerà. Hai dimenticato di includere scope.Complete(); alla fine

+0

@ user281180 L'ho fatto apposta, non voglio che si impegni, e mi genera un errore – Omu

3

Potrebbe essere necessario specificare il TransactionScopeOption come in questo esempio da 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)) 
    { 
    ... 
    } 
} 

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

Problemi correlati