我有一个表A,在主键上有一个聚集索引,在第二列(act_id)(表B的外键)上有一个非聚集索引
两个更新语句正在生成以下死锁: Deadlock 1
此死锁似乎不是书签查找死锁,因为它位于相同的索引和相同的objid上。将pk包括在非聚集索引中并没有带来任何成功。 我确实了解到,objid不是recordid,而是索引中的范围。
导致该死锁的查询(例如,更新set act_id = 1,其中act_id = 2)具有以下执行计划: Execution plan
有时同一死锁位于只有一个聚集索引的另一张表上:Same deadlock on another table
有人知道如何避免这种僵局吗?
答案 0 :(得分:2)
两个查询似乎都在更新聚集索引B树的相同部分。 这个并发问题有多种答案。一种是获得更快的硬件。另一个可能是没有可以更改的主键。
我首先要问你:您是否要通过2个单独的查询来更新主键?
你有自然钥匙吗?
您是否在主键/外键上设置了级联更新?
您的其他阻止查询是什么?
在非聚集索引中包含pk并没有带来成功
那是因为pk始终位于所有非聚集索引中,否则它将如何进行书签查找?
答案 1 :(得分:1)