你可以安心吗?

我使用以下方式使用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

下一篇: why reuse types in referenced assemblies