C#中TransactionScope捕获内部异常时的行为及回滚抑制方案咨询
TransactionScope捕获异常后的事务行为分析
一、异常被捕获后事务是否会回滚?
是的,即使异常被catch块处理,外层事务依然会回滚。
原因在于:TransactionScope的事务上下文会在任何异常抛出时(无论是否被捕获)自动标记为“回滚状态”。哪怕你在catch里处理了错误,只要这个异常发生在外层TransactionScope的上下文中,事务的内部状态已经被标记为不可提交。后续调用transaction.Complete()不会产生提交效果,当using块结束时,事务会自动回滚。
对应你给出的示例代码,只要try块里的代码抛出过异常,哪怕被catch住,最后整个事务还是会回滚,不会提交任何之前的操作。
二、用嵌套TransactionScopeOption.Suppress能否阻止回滚?
可以。
当你在try块内嵌套一个设置为TransactionScopeOption.Suppress的TransactionScope时,这个嵌套块会脱离当前的事务上下文,内部的所有操作都不会加入到外层事务中。此时如果嵌套块内抛出异常,只会影响这个独立的无事务上下文,不会标记外层事务为回滚状态。
修改后的示例代码如下:
using (var transaction = new TransactionScope()) { // 属于外层事务的操作 try { using (var suppressedScope = new TransactionScope(TransactionScopeOption.Suppress)) { // 这里的操作不在外层事务中,抛出异常也不会影响外层事务 // do some work that may fail suppressedScope.Complete(); } } catch { // 处理错误 } // 继续外层事务的操作 transaction.Complete(); }
这种情况下,即使嵌套的Suppress块里抛出异常并被捕获,外层事务的状态不会被标记为回滚,只要后续正常调用transaction.Complete(),外层事务的操作就会被正常提交。
内容的提问来源于stack exchange,提问作者the_black_knight
相关产品推荐
相关产品推荐

