两个嵌套的事务范围导致:事务已中止。

8

这段代码给我报错:事务已中止。 如果我移除一个嵌套的事务,就不会抛出异常。

  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个回答

13

哪个语句抛出了错误?我猜是最后一个repo.Insert

由于您没有调用scope.Complete(),因此当aaa被处理时,事务将被回滚(中止)。
通常情况下,事务回滚被认为是一种错误,因此所有更高级别的事务也变得不可提交(或立即回滚)。
因此,对于最后一个repo.Insert,没有有效的事务可用——这就是为什么它会抛出异常的原因。


4
您可能需要像MSDN中的示例一样指定TransactionScopeOption:

您可能需要像MSDN中的示例一样指定TransactionScopeOption:

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

这个链接提供了有关Microsoft SQL Server中的查询优化器的详细信息。查询优化器是SQL Server的一个重要组件,它负责解释和执行查询,并根据可用索引和其他条件来确定最佳执行计划。了解查询优化器的工作原理和如何使用它可以帮助您更好地优化数据库性能和查询响应时间。

2

是的,它能正常工作。你忘记在结尾处包含scope.Complete();


@user281180 我是故意这样做的,我不想提交它,而且它会抛出一个错误。 - Omu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接