首页 > 解决方案 > SQL Server - 聚集索引死锁

问题描述

我有一个表 A,主键上有一个聚集索引,第二列有一个非聚集索引(act_id)(表 B 的外键)

两个更新语句正在生成以下死锁: 死锁 1

这个死锁似乎不是书签查找死锁,因为它在同一个索引和同一个 objid 上。在非聚集索引中包含 pk 并没有带来任何成功。我确实明白,objid 不是recordid,而是索引中的一个范围。

导致此死锁的查询(例如更新 set act_id = 1 where act_id = 2)具有以下执行计划: 执行计划

有时同一个死锁在另一个只有一个聚集索引的表上:同一个死锁在另一个表上

有谁知道如何避免这种僵局?

标签: sql-serverdeadlockclustered-indexnon-clustered-index

解决方案


这两个查询似乎都在更新聚集索引的 B 树的同一部分。这个并发问题有多种答案。一种是获得更快的硬件。另一个是没有可以更改的主键。

我首先要问你:你是从 2 个单独的查询中更新你的主键吗?
你有天然钥匙吗?
您是否在主键/外键上设置了级联更新?
您的其他阻止查询是什么?

在非聚集索引中包含pk并没有带来任何成功

那是因为 pk 总是在所有非聚集索引中,否则它会如何进行书签查找?


推荐阅读