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