当使用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异常之前执行清理它所需的任何操作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。