【发布时间】:2011-05-28 17:29:09
【问题描述】:
我有两个事务范围,一个在另一个范围内。我很想知道内部事务范围在提交后是否会回滚,而外部事务范围没有完成。
【问题讨论】:
-
各种
TransactionScopeOption选择的很好解释;终于有道理了:docs.microsoft.com/en-us/previous-versions/…
标签: c# transactionscope
我有两个事务范围,一个在另一个范围内。我很想知道内部事务范围在提交后是否会回滚,而外部事务范围没有完成。
【问题讨论】:
TransactionScopeOption选择的很好解释;终于有道理了:docs.microsoft.com/en-us/previous-versions/…
标签: c# transactionscope
这取决于您启动嵌套事务范围的范围选项。
如果你使用默认选项TransactionScopeOption.Required,那么嵌套作用域将与外部作用域在同一个事务中登记,因此当外部作用域回滚时,内部作用域也将被回滚,即使它调用了@987654322 @。
但是,如果您使用TransactionScopeOption.RequiresNew,则嵌套范围将开始自己的事务并与外部范围分开完成,因此即使外部范围回滚,它也不会回滚。
如果您使用TransactionScopeOption.Suppress,则嵌套范围将不参与外部事务,并将以非事务方式完成,因此不构成外部事务回滚时将回滚的工作的一部分。
【讨论】:
由于它们是嵌套的,内部事务将回滚。
这不是全部,取决于您如何创建嵌套事务,但默认情况下,它会回滚。
This article 深入了解TransactionScope,应该会回答您的大部分问题。
分发与否无关紧要。
【讨论】:
是的,你可以参考下面的代码。如果内部事务抛出错误,则以下代码将回滚外部事务范围,反之亦然。
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;
}
}
}
【讨论】: