Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果外部事务作用域没有';不完整?_C#_Transactionscope - Fatal编程技术网

C# 如果外部事务作用域没有';不完整?

C# 如果外部事务作用域没有';不完整?,c#,transactionscope,C#,Transactionscope,我有两个事务作用域,一个在另一个内。我想知道内部事务作用域在提交后是否会回滚,而外部事务作用域未完成。由于它们是嵌套的,内部事务将回滚 这不是全部,取决于您如何创建嵌套事务,但默认情况下,它将回滚 深入了解TransactionScope,并回答您的大部分问题 分发与否无关。这取决于启动嵌套事务作用域的作用域选项 如果使用默认选项TransactionScopeOption.Required,则嵌套作用域将与外部作用域登记在同一事务中,因此,当外部作用域回滚时,内部作用域也将回滚,即使它调用了

我有两个事务作用域,一个在另一个内。我想知道内部事务作用域在提交后是否会回滚,而外部事务作用域未完成。

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

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

深入了解
TransactionScope
,并回答您的大部分问题



分发与否无关。

这取决于启动嵌套事务作用域的作用域选项

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

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


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

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

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


@Frantisek提到了分布式事务。我怎么知道我在使用分布式事务?我想我错了。使用TransactionScope,您可能不需要dtc就能让它工作。阅读以下内容:“虽然嵌套范围可以加入根范围的环境事务,但在嵌套范围中调用Complete对根范围没有影响。只有当从根范围到最后一个嵌套范围的所有范围都投票提交事务时,事务才会被提交。”我确信您知道这一点,但术语“内部事务”和“嵌套事务”在谈论TransactionScope时,IMHO是不合适的,因为实际上没有嵌套的事务,只有嵌套的TransactionScope。如果选择TransactionScopeOption.Required,则它仅为1个大事务,并带有TransactionScopeOption.RequiresNew有2个完全独立的事务,但它们不是嵌套的(封闭的)嵌套事务。完美答案:)如果将两个抑制作用域嵌套在第三个外部作用域下会怎么样?我是否应该在两个内部抑制作用域上调用complete,这是否会干扰外部父作用域?这是对各种
TransactionScopeOption
选择的一个很好的解释;这最终是有意义的:如果root或child捕获异常,这将回滚
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;
           }

  }
}