我在运行于MS SQL Server 2005之上的.NET 2.0 Web应用程序上遇到了非常少见却令人讨厌的SQL死锁。过去,我们一直以非常经验的方式处理SQL死锁-基本上调整查询直到工作。
但是,我发现这种方法非常不令人满意:既耗时又不可靠。我非常希望遵循确定性查询模式,该模式将通过设计确保永远不会遇到SQL死锁。
例如,在C#多线程编程中,必须按照其字典顺序采用简单的设计规则(例如锁),以确保不会发生死锁。
是否有任何SQL编码模式可保证防死锁?
编写防死锁代码确实很困难。即使以相同的顺序访问表,也可能会出现死锁[1]。我在博客上写了一篇文章,阐述了一些方法,这些方法将帮助您避免和解决僵局。
如果要确保两个语句/事务永远不会死锁,则可以通过使用sp_lock系统存储过程观察每个语句消耗的锁来实现此目的。为此,您必须非常快,或者使用带有保持锁提示的开放式事务。
sp_lock
笔记:
一次需要多个锁的任何SELECT语句都可能因智能设计的事务而死锁,该事务以相反的顺序获取锁。