我在 MS SQL Server 2005 之上运行的 .NET 2.0 Web 应用程序上遇到了非常罕见但烦人的 SQL 死锁。过去,我们一直以非常经验的方式处理 SQL 死锁 - 基本上是调整查询,直到它有效。
然而,我发现这种方法非常不令人满意:耗时且不可靠。我非常愿意遵循确定性查询模式,以确保通过设计永远不会遇到 SQL 死锁。
例如,在 C# 多线程编程中,一个简单的设计规则(例如必须按照其字典顺序获取锁)可确保永远不会发生死锁。 p>
有没有保证不会出现死锁的 SQL 编码模式?
最佳答案
编写防死锁代码确实很困难。即使您以相同的顺序访问表,您仍然可能会遇到死锁 [1]。我写了a post on my blog其中详细阐述了一些可以帮助您避免和解决僵局情况的方法。
如果您想确保两个语句/事务永远不会死锁,您可以通过使用 sp_lock 系统存储过程观察每个语句消耗哪些锁来实现它。要做到这一点,您必须非常快,或者使用带有保持锁提示的开放事务。
<小时/>注释:
- 任何同时需要多个锁的 SELECT 语句都可能对以相反顺序获取锁的智能设计事务造成死锁。
关于sql - 零 SQL 死锁设计 - 有编码模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/111707/