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