sql-server - SQL Server - 聚集索引上的死锁

标签 sql-server deadlock clustered-index non-clustered-index

我有一个表 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/

相关文章:

c# - SQL Server返回给C#的是什么

SQL查询两次返回同一行数据

c# - 获取锁并进一步尝试锁定不会阻止 : are C# locks re-entrant?

python - 关于python死锁模拟的问题

C#:从锁定 block 调用事件

c# - SQL Server : ADO.Net GetUpdateCommand ok with PK,在添加另一个聚集唯一索引后失败

sql-server - 消息 102,级别 15,状态 1 '>' 附近语法错误

sql-server - 在选择查询中向 xml 列添加节点

sql-server - 主键在sql server中总是有索引吗?

sql-server-2005 - 我应该怎么做才能获得聚集索引查找而不是聚集索引扫描?