已处理异常的C#事务仍将回滚?

已处理异常的C#事务仍将回滚?,c#,sql-server,transactionscope,C#,Sql Server,Transactionscope,考虑到这段代码: 使用(TransactionScope tran=new TransactionScope()){ insertStatementMethod1(); insertStatementMethod2(); //这可能会失败 试一试{ insertStatementMethod3(); }捕获(例外e){ //无事可做 } trans.Complete(); } 在insertStatementMethod1和insertStatementMethod2中完成的任何操作都将回滚吗

考虑到这段代码:

使用(TransactionScope tran=new TransactionScope()){
insertStatementMethod1();
insertStatementMethod2();
//这可能会失败
试一试{
insertStatementMethod3();
}捕获(例外e){
//无事可做
}
trans.Complete();
}
insertStatementMethod1
insertStatementMethod2
中完成的任何操作都将回滚吗?无论如何? 如果我想让它们执行,我需要检查它在事务之前是否会失败,并在此基础上构建我的事务代码

更新

代码与此类似

using(TransactionScope tran = new TransactionScope()) {
    // <standard code>
    yourExtraCode();
    // <standard code>
    tran.Complete();
}
我只能编辑
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
        }
    }
}
public void yourExtraCode(){
insertStatementMethod1();
insertStatementMethod2();
//这个电话可能会失败

如果(findOutIfIcanInsert()){/不想处理前两个方法,只需将它们从环境事务的作用域中移出即可


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

检查此项实际上,您可以选择不作为环境事务的一部分,请参见下面的答案。我的示例有点简化。实际上,我已经编写了一个在事务内部调用的方法。我无法控制作用域的开始和结束位置,但我可以围绕调用编写if语句s、 但是,SQL查询会带来这种情况,因此会影响性能
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
        }
    }
}