2010-10-05 53 views
8

este código me da el error: la transacción ha abortado. si quito 1 transacción anidada de lo que no lanza2 hermanos anidados transactionScope da: la transacción ha abortado

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

Respuesta

12

Qué afirmación no tirar el error? Supongo que es el último repo.Insert.

Como no llama a scope.Complete(), la transacción se retrotrae (cancela) cuando se elimina aaa.
En general, la reversión de transacción se considera un error, por lo que todas las transacciones de nivel superior también se vuelven no modificables (o se vuelven a anular inmediatamente).
Por lo tanto, para el último repo.Insert no hay una transacción válida para usar, por eso arroja una excepción.

2

sí, va a trabajar. Has olvidado incluir scope.Complete(); al final

+0

@ user281180 Lo hice a propósito, no quiero que se cometa, y me arroja un error – Omu

3

Es posible que tenga que especificar el TransactionScopeOption como en este ejemplo 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

Cuestiones relacionadas