我正在使用MS-SQL 2008并在网络项目中使用C#进行编码。
目前,我遇到了sql死锁问题。
我有2个交易,其中一个是长期交易。
当两个事务同时运行时,会发生死锁,并且会选择短事务自动终止。
My Current解决方案,我正在捕捉死锁的异常并重做短交易,它运行良好,只需要一些时间。
但是,我想知道是否有任何解决办法可以避免根本原因造成死锁?
答案 0 :(得分:6)
不,你不能完全避免死锁,只能缓解死锁。
使用RCSI隔离模式。这基本上是MVCC,但您必须要注意SQL Server将still use the ANSI ACID modes on occasion(DBA.SE回答)。此模式会阻止编写器阻止读取器,但不会帮助编写器 - 编写器相互阻塞。
客户端重试逻辑。
尝试以相同的顺序进行表格更新,例如T1 - > T2总是
避免长时间交易:例如,客户端轮流绊倒并保持交易开放。您可以使用存储过程,更好的索引或简单地调整查询来缓解此问题