我有两个交易范围,一个在另一个范围内。我很想知道内部事务范围是否会在提交后回滚,而外部事务范围是否会完成。
答案 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;
}
}
}