c# – TransactionScope在处置之前中止了交易

c# – TransactionScope在处置之前中止了交易,第1张

概述当使用TransactionScope时,它表示如果内部执行的代码回滚事务,那么父事务也将回滚.这对我有好处.但是当处置该范围时,它会抛出异常,这意味着事务已经回滚并且已中止. 那么处理这个并正确处理范围的正确方法是什么? using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew) 当使用TransactionScope时,它表示如果内部执行的代码回滚事务,那么父事务也将回滚.这对我有好处.但是当处置该范围时,它会抛出异常,这意味着事务已经回滚并且已中止.
那么处理这个并正确处理范围的正确方法是什么?
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))    {                    using (var conn = GetConnection())                    {                            string query =               @"some query that may contain transaction itself               or some SP whith transaction included"                            using (var command = new sqlCommand(query,conn))                                command.ExecuteNonquery();                        }                    }                    scope.Complete();    } // Exception here
解决方法 即使调用了scope.Complete(),scope.dispose()也可能抛出TransactionAborted异常.例如,一些足够聪明的存储过程可以处理异常并使用T-sql TRY / CATCH构造在T-sql脚本中中止事务,而不会向调用者抛出异常.
所以我认为我建议的最安全的方法如下:
try{    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))    {        try        {            using (var conn = GetConnection())            {                string query =                 @"some query that may contain transaction itself                 or some SP whith transaction included"                using (var command = new sqlCommand(query,conn))                command.ExecuteNonquery();            }        }        catch (sqlException ex)        {            // log sql Exception,if any            throw;  // re-throw exception        }        scope.Complete();    }}catch (TransactionAbortedException ex){    // we can get here even if scope.Complete() was called.    // log TransactionAborted exception if necessary}

并且不用担心处理TransactionScope. scope.dispose在抛出TransactionAborted异常之前执行清理它所需的任何 *** 作.

总结

以上是内存溢出为你收集整理的c# – TransactionScope在处置之前中止了交易全部内容,希望文章能够帮你解决c# – TransactionScope在处置之前中止了交易所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存