已处理异常的 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();
}

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
        }
    }
}

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

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

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