处理异常的C#事务仍会回滚吗?

时间:2016-11-10 06:26:24

标签: c# sql-server transactionscope

考虑这段代码:

using(TransactionScope tran = new TransactionScope()) {

    insertStatementMethod1();
    insertStatementMethod2();
    // this might fail
    try {
        insertStatementMethod3();
    } catch (Exception e) {
        // nothing to do
    }

    tran.Complete();
}

insertStatementMethod1insertStatementMethod2中的所有内容是否会被回滚?在任何情况下? 如果我还是希望它们执行,我需要在事务发生之前检查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
        }
    }
}

但是,需要在数据库中查找会影响性能的内容。 有没有更好的方法,或者我需要在调用方法之前找出答案? 我试过了,当然交易按预期回滚了。

1 个答案:

答案 0 :(得分:1)

如果您不希望处理前两种方法,只需将它们从环境事务的范围中移出。

如果您无法控制启动环境事务的代码,可以通过创建新的环境事务来禁止它:using (var scope = new TransactionScope(TransactionScopeOption.Suppress))