2

我正在使用 MS-SQL 2008 并在 Web 项目中使用 C# 进行编码。

目前,我陷入了 sql 死锁。

我有 2 笔交易,其中一项是长交易。

当两个事务同时运行时,会发生死锁,短事务会被选择自动终止。

我当前的解决方案,我正在捕获死锁异常并重做短事务,它运行良好,只是需要一些时间。

但是,我想知道是否有任何解决方案可以从根本上避免死锁?

4

1 回答 1

6

不,你不能完全避免死锁,只能缓解它们。

  • 使用RCSI隔离模式。这基本上是MVCC,但您必须注意 SQL Server有时仍会使用 ANSI ACID 模式(DBA.SE 答案)。这种模式会阻止作者阻止读者,但不会帮助作者-作者相互阻止。

  • 客户端重试逻辑。经典的方式

  • 尝试以相同的顺序进行表更新,例如 T1 -> T2 总是

  • 避免长事务:例如,客户端是否经常往返并保持事务开放。您可以通过存储过程、更好的索引或简单地调整查询来缓解这种情况

于 2013-06-11T08:25:07.410 回答