已处理异常的 C# 事务仍会回滚吗?
C# transaction with handled exception will still roll back?
考虑这段代码:
using(TransactionScope tran = new TransactionScope()) {
insertStatementMethod1();
insertStatementMethod2();
// this might fail
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
tran.Complete();
}
在 insertStatementMethod1
和 insertStatementMethod2
中所做的任何事情都会被回滚吗?任何状况之下?
如果我想让它们执行,我需要检查它 insertStatementMethod3
是否会在交易前失败,并基于此构建我的交易代码?
更新
代码看起来与此类似
using(TransactionScope tran = new TransactionScope()) {
// <standard code>
yourExtraCode();
// <standard code>
tran.Complete();
}
我在哪里可以编写 yourExtraCode()
方法
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
insertStatementMethod3();
}
我只能编辑yourExtraCode()
方法,所以我不能选择是否在交易范围内。一个简单的可能解决方案是:
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
if (findOutIfIcanInsert()) { // <-- this would come by executing sql query
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
}
}
但这需要在数据库中查找会影响性能的内容。
有没有更好的方法,或者我需要在调用该方法之前找出答案?
我试过了,当然事务按预期回滚了。
如果您不希望处理前两个方法,只需将它们移出环境事务的范围即可。
如果您无法控制启动环境事务的代码,您可以通过创建新的环境事务来抑制它:using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
。
考虑这段代码:
using(TransactionScope tran = new TransactionScope()) {
insertStatementMethod1();
insertStatementMethod2();
// this might fail
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
tran.Complete();
}
在 insertStatementMethod1
和 insertStatementMethod2
中所做的任何事情都会被回滚吗?任何状况之下?
如果我想让它们执行,我需要检查它 insertStatementMethod3
是否会在交易前失败,并基于此构建我的交易代码?
更新
代码看起来与此类似
using(TransactionScope tran = new TransactionScope()) {
// <standard code>
yourExtraCode();
// <standard code>
tran.Complete();
}
我在哪里可以编写 yourExtraCode()
方法
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
insertStatementMethod3();
}
我只能编辑yourExtraCode()
方法,所以我不能选择是否在交易范围内。一个简单的可能解决方案是:
public void yourExtraCode() {
insertStatementMethod1();
insertStatementMethod2();
// this call might fail
if (findOutIfIcanInsert()) { // <-- this would come by executing sql query
try {
insertStatementMethod3();
} catch (Exception e) {
// nothing to do
}
}
}
但这需要在数据库中查找会影响性能的内容。 有没有更好的方法,或者我需要在调用该方法之前找出答案? 我试过了,当然事务按预期回滚了。
如果您不希望处理前两个方法,只需将它们移出环境事务的范围即可。
如果您无法控制启动环境事务的代码,您可以通过创建新的环境事务来抑制它:using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
。