2兄弟嵌套的transactionScope给出:事务已中止

时间:2010-10-05 06:24:07

标签: c# .net ado.net transactionscope

此代码给出了错误:交易已中止。 如果我删除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 个答案:

答案 0 :(得分:12)

什么语句会引发错误?我认为它是最后一个repo.Insert

由于您没有调用scope.Complete(),因此在处理aaa时,事务将被回滚(中止)。 通常,事务回滚被视为错误,因此所有更高级别的事务也变得无法提交(或立即回滚)。 因此,对于最后一个repo.Insert,没有有效的事务可以使用 - 这就是它抛出异常的原因。

答案 1 :(得分:3)

您可能需要在此示例中指定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)) 
    {
     ...
    } 
}

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

答案 2 :(得分:2)

是的,它会起作用。你忘了包括scope.Complete();最后