你可以安心吗?
我使用以下方式使用TransactionScope
using (var scope = new TransactionScope())
{
using (var conn = SQLHelpers.GetSQLConnection())
{
//commands here
}
scope.Complete();
}
有时我在调用scope.Complete()
时收到TransactionAbortedException
,因为事务已经回滚,并且我使用分析器来确定问题是死锁。
异常事务(进程ID 59)在另一进程的锁资源上死锁,并被选为死锁受害者。 重新运行交易。
我从那以后发现了死锁的原因,但它让我想知道为什么这个错误没有冒泡到TransactionAbortedException
所以我确实可以重新运行这个事务,仅仅是为了这个特定的情况。 内部异常没有包含任何可以指示实际错误的信息。
检测TransactionAbortedException
作为重新运行TransactionAbortedException
的理由是否安全?
到目前为止,我已经看到以下内部例外:
1)死锁
2)超时
3)'连接被关闭'
4)..其他?
在这些情况中只有一种情况下,重新运行事务似乎是适当的,但是如果确保回滚,则可以将其推广到所有情况。 这个问题可以重新说明问'TransactionAbortedException保证事务回滚'吗?
这个问题可以重新说明问'TransactionAbortedException保证事务回滚'吗?
TransactionAbortedException
的文档说:
例如,当您尝试对已经超时的事务调用Commit
方法时,在已经回滚的事务上执行操作时会引发此异常。 当尝试提交事务并且事务中止时,也会引发此异常。
这是一个可恢复的错误。
我认为从这个描述中可以清楚地看到,如果你发现这个异常,你的交易由于某种原因没有成功完成。 我对这些文档的理解是:“无论交易试图做什么变化都不会被提交给数据库”。
“这是一个可恢复的错误”,所以如果您的事务的性质是有意义的,那么您应该在捕获此异常之后重试它。
你可能想要介绍一些重试的逻辑,比如在重试之前等待一段时间。 随着重试次数的增加,增加此等待时间。 对所有重试次数或总重试次数进行限制,并在所有尝试重试失败时适当地做出明智/失败的事情。
链接地址: http://www.djcxy.com/p/36893.html上一篇: can you safely re