如何自动重新运行死锁事务?(ASP.NET MVC/SQL Server)

Ale*_*lex 5 sql-server asp.net-mvc

我在ASP.NET MVC/SQL Server中有一个非常受欢迎的站点,不幸的是发生了很多死锁.虽然我试图通过SQL分析器找出它们出现的原因,但我想知道在执行死锁时如何更改SQL Server的默认行为.

是否可以重新运行导致问题的事务而不是显示错误屏幕?

Gil*_*ili 10

Remus的答案存在根本缺陷.根据/sf/answers/7857951/,一致的锁定顺序不会阻止死锁.我们能做的最好的事情是降低频率.

他在两点上错了:

  1. 暗示可以防止死锁.您将找到有关减少死锁频率的Microsoft和IBM发表的文章.没有他们声称你可以完全阻止他们.
  2. 这意味着所有死锁都需要您重新评估状态并做出新的决定.在应用程序级别重试某些操作是完全正确的,只要您远远回到决策点即可.

附注:Remus的主要观点是数据库无法代表您自动重试该操作,并且他完全正确.但这并不意味着重新运行操作是对死锁的错误响应.


Rem*_*anu 6

你正在咆哮错误的树.您永远不会成功地通过SQL引擎进行自动死锁重试,这种概念从根本上是错误的.死锁的定义是你决定的状态已经改变,因此你需要再次阅读状态并做出新的决定.如果您的进程已陷入僵局,根据定义,另一个进程已经赢得了死锁,并且它已经改变了您已阅读的内容.

唯一的重点应该是找出死锁发生的原因并消除原因.事实上,原因将是扫描更多数据的查询.虽然可以发生其他类型的死锁,但我打赌不是你的情况.通过部署适当的索引可以解决许多问题.有些问题会将您送回绘图板,您将不得不重新考虑您的要求.

关于如何识别和解决死锁的资源有很多很多:

您还可以考虑使用快照隔离,因为快照中涉及的无锁读取会减少可能发生死锁的表面(即,只能发生写写死锁).请参阅使用基于行版本控制的隔离级别.