我有一个表 A,主键上有聚集索引,第二列 (act_id) 上有一个非聚集索引(表 B 的外键)
两个更新语句产生以下死锁:
Deadlock 1
这个死锁似乎不是书签查找死锁,因为它在同一个索引和同一个 objid 上。在非聚集索引中包含 pk 并没有带来任何成功。
我确实明白,objid 不是 recordid,而是索引中的一个范围。
导致此死锁的查询(例如更新集合 act_id = 1,其中 act_id = 2)具有以下执行计划:
Execution plan
有时同样的死锁发生在另一个只有一个聚集索引的表上:Same deadlock on another table
有人知道如何避免这种僵局吗?
最佳答案
这两个查询似乎都在更新聚集索引的 B 树的同一部分。
这个并发问题有多种答案。一种是获得更快的硬件。另一种是没有可以更改的主键。
我首先会问您:您是否从 2 个单独的查询更新主键?
你有自然键吗?
您是否在主键/外键上设置了级联更新?
你的其他阻塞查询是什么?
Including the pk in the non-clustered index has not brought any success
那是因为 pk 总是在所有非聚集索引中,否则它如何进行书签查找?
关于sql-server - SQL Server - 聚集索引上的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52402908/