如果外部事务范围未完成,内部事务范围是否会回退?

时间:2010-12-21 09:44:23

标签: c# transactionscope

我有两个交易范围,一个在另一个范围内。我很想知道内部事务范围是否会在提交后回滚,而外部事务范围是否会完成。

3 个答案:

答案 0 :(得分:95)

它取决于您使用的嵌套事务作用域的范围选项。

如果使用默认选项TransactionScopeOption.Required,则嵌套作用域将在与外部作用域相同的事务中登记,因此当外部作用域回滚时,内部作用域也将被回滚,即使它已调用Complete

但是,如果使用TransactionScopeOption.RequiresNew,则嵌套作用域将开始自己的事务并与外部作用域分开完成,因此即使外部作用域回滚也不会回滚。

如果使用TransactionScopeOption.Suppress,则嵌套作用域将不参与外部事务,并且将以非事务方式完成,因此如果外部事务回滚,则不构成将回滚的工作的一部分。

答案 1 :(得分:26)

由于它们是嵌套的,因此内部事务将回滚。

这不是全部,而是取决于您如何创建嵌套事务,但默认情况下,它将回滚。

This article深入了解TransactionScope并且应该回答您的大多数问题。


分发与否是无关紧要的。

答案 2 :(得分:0)

是的,你可以参考下面的代码。如果内部事务抛出错误,以下代码将回滚外部事务范围,反之亦然。

   public bool rootMethod(){
          using (var transaction = new(TransactionScopeOption.RequiresNew))
           try{
           // your code here
           SomeController someController = new SomeController();
           var responseFromChildMethod = someController.childMethodWithTxn();

       // your logic here

       transaction.Complete();
       return true;
       }
       catch(Exception ex){
       transaction.Dispose();
       return false;
       }
    } 
}

SomeController.cs

public bool childMethodWithTxn(){
  using(var newTransaction =  new TransactionScope()){
    try{
      //your code here
      newTransaction.Complete();
      return true;
    }
    catch(Exception ex){
           newTransaction.Dispose();
           return false;
           }

  }
}