考虑这段代码:
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
}
}
}
但是,需要在数据库中查找会影响性能的内容。 有没有更好的方法,或者我需要在调用方法之前找出答案? 我试过了,当然交易按预期回滚了。
答案 0 :(得分:1)
如果您不希望处理前两种方法,只需将它们从环境事务的范围中移出。
如果您无法控制启动环境事务的代码,可以通过创建新的环境事务来禁止它:using (var scope = new TransactionScope(TransactionScopeOption.Suppress))
。