2 братские вложенные транзакции дают: транзакция прервана - PullRequest
7 голосов
/ 05 октября 2010

этот код выдаёт мне ошибку: Транзакция прервана. если я удалю 1 вложенную транзакцию, она не выдаст

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

Ответы [ 3 ]

12 голосов
/ 08 октября 2010

Какое утверждение выдает ошибку? Я бы предположил, что это последний repo.Insert.

Поскольку вы не вызываете scope.Complete (), транзакция откатывается (прерывается) при удалении aaa.
Обычно откат транзакции считается ошибкой, поэтому все транзакции более высокого уровня также становятся нефиксированными (или немедленно откатываются).
Итак, для последней repo.Insert нет действительной транзакции для использования - поэтому она выдает исключение.

3 голосов
/ 08 октября 2010

Может потребоваться указать TransactionScopeOption, как в этом примере из 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

2 голосов
/ 05 октября 2010

да, это будет работать. Вы забыли включить scope.Complete (); в конце

...