我正在使用 MS-SQL 2008 并在 Web 项目中使用 C# 进行编码。
目前,我陷入了 sql 死锁。
我有 2 笔交易,其中一项是长交易。
当两个事务同时运行时,会发生死锁,短事务会被选择自动终止。
我当前的解决方案,我正在捕获死锁异常并重做短事务,它运行良好,只是需要一些时间。
但是,我想知道是否有任何解决方案可以从根本上避免死锁?
我正在使用 MS-SQL 2008 并在 Web 项目中使用 C# 进行编码。
目前,我陷入了 sql 死锁。
我有 2 笔交易,其中一项是长交易。
当两个事务同时运行时,会发生死锁,短事务会被选择自动终止。
我当前的解决方案,我正在捕获死锁异常并重做短事务,它运行良好,只是需要一些时间。
但是,我想知道是否有任何解决方案可以从根本上避免死锁?
不,你不能完全避免死锁,只能缓解它们。
使用RCSI隔离模式。这基本上是MVCC,但您必须注意 SQL Server有时仍会使用 ANSI ACID 模式(DBA.SE 答案)。这种模式会阻止作者阻止读者,但不会帮助作者-作者相互阻止。
客户端重试逻辑。经典的方式
尝试以相同的顺序进行表更新,例如 T1 -> T2 总是
避免长事务:例如,客户端是否经常往返并保持事务开放。您可以通过存储过程、更好的索引或简单地调整查询来缓解这种情况