如何避免sql死锁?

kid*_*dgu 2 c# sql asp.net sql-server-2008

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

目前,我陷入了sql死锁.

我有2个交易,其中两个是长期交易.

当两个事务同时运行时,会发生死锁,并且将选择短事务自动终止.

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

但是,我想知道是否有任何解决方案可以避免根本原因造成的死锁?

gbn*_*gbn 6

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

  • 使用RCSI隔离模式.这基本上是MVCC,但你必须要注意SQL Server 仍然会使用ANSI ACID模式(DBA.SE答案).此模式会阻止编写器阻止读取器,但不会帮助编写器 - 编写器相互阻塞.

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

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

  • 避免长时间交易:例如,客户端轮流绊倒并保持交易开放.您可以使用存储过程,更好的索引或简单地调整查询来缓解这种情况

  • 哇,不.这意味着你在内存和磁盘上使用了大量浪费的空间.它可能是一个隐藏真正问题的临时修复.但如果它适合你,嘿.没有表,索引和代码我们就不能再帮忙了. (2认同)