此代码给出了错误:交易已中止。 如果我删除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" });
}
}
}
答案 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))
{
...
}
}
答案 2 :(得分:2)