我在 MS SQL Server 2005 之上运行的 .NET 2.0 Web 应用程序上遇到了非常罕见但烦人的 SQL 死锁。过去,我们一直以非常经验的方式处理 SQL 死锁 - 基本上是调整查询直到它起作用。
然而,我发现这种方法非常不令人满意:耗时且不可靠。我非常愿意遵循确定性查询模式,以确保按设计永远不会遇到 SQL 死锁。
例如,在 C# 多线程编程中,一个简单的设计规则如必须按照字典顺序获取锁确保不会出现死锁ever happen.
是否存在保证不会出现死锁的 SQL 编码模式?
编写防死锁代码确实很困难。即使您以相同的顺序访问表,您仍然可能会遇到死锁 [1]。我写我的博客上的一篇文章 http://samsaffron.com/archive/2008/08/27/Deadlocked+其中详细阐述了一些可以帮助您避免和解决僵局情况的方法。
如果您想确保两个语句/事务永远不会死锁,您可以通过使用以下方法观察每个语句消耗哪些锁来实现它:sp_lock系统存储过程。要做到这一点,您必须非常快,或者使用带有保持锁提示的开放事务。
Notes:
- 任何同时需要多个锁的 SELECT 语句都可能对智能设计的事务(以相反顺序获取锁)造成死锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)