sql-server - SQL Server 在选择/更新或多选择之间死锁

标签 sql-server sql-server-2005 deadlock

有关 SQL Server 死锁的所有文档都讨论了这样的场景:操作 1 锁定资源 A,然后尝试访问资源 B,而操作 2 锁定资源 B 并尝试访问资源 A。

但是,我经常在一些繁忙的应用程序中看到选择和更新之间甚至多个选择之间的死锁。我发现死锁跟踪输出的一些细节非常难以理解,但我真的只想了解什么会导致两个单个操作之间的死锁。当然,如果选择有读锁,则更新应该在获取排它锁之前等待,反之亦然?

这种情况发生在 SQL Server 2005 上,但我认为这不会产生影响。

最佳答案

发生这种情况是因为选择锁定了两个不同的索引,同时更新以相反的顺序锁定了相同的索引。 select 需要两个索引,因为第一个索引没有覆盖它需要访问的所有列;更新需要两个索引,因为如果您更新索引的键列,则需要锁定它。

http://blogs.msdn.com/bartd/archive/2006/09/25/770928.aspx有一个很棒的解释。建议的修复包括添加一个涵盖 select 所需的所有列的索引、切换到快照隔离或显式强制 select 获取通常不需要的更新锁。

关于sql-server - SQL Server 在选择/更新或多选择之间死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/661908/

相关文章:

sql-server - 需要改进 SQL 子查询性能

sql-server - 更新锁的用途

sql-server - 使用 ASP.NET MVC 和 SQL Server 实现家谱的最佳方法是什么

sql-server-2005 - 在 T-SQL2005 中处理 10 0's of 1,000,000' 行

mysql - Sonar 库 4.5.4 : MySQL deadlock

c# - 哪种 C# 数据类型相当于 SQL Server 中的钱?

sql - 从表中选择标量值

sql-server - 更新二进制字段从文件系统获取文件而不使用动态 SQL

javascript - 如何在 JavaScript 中实现锁

java - 两个BlockingQueue——死锁