问这个问题我可能很愚蠢,但我想知道为什么 SQL Server 在运行 DML 查询时更喜欢页面锁定而不是行锁定。
在我的特定场景中,我在各种死锁图中看到,应该 S 锁定 400-500 行的查询正在选择页面锁定 - 首先进入死锁。请注意,我没有在我们的索引中禁用行锁。此外,我真的不认为我缺少索引,因为来自 SQL 的唯一建议是“在此表的每一列上创建一个非聚集索引”排序。
需要明确的是:我不是在寻求解决我们的死锁的帮助(至少现在还没有),我只是想了解我是否遗漏了一些东西来尝试预测 SQL Server 的行为方式。
页面锁可能用于行锁的原因有很多,但最基本的答案是内存管理。400-500 行锁可能远没有锁定少量页面来完成相同任务的吸引力。
查询的编写方式或索引的设计方式也可能与所采用的锁类型有关。
更多详细信息请参见我的帖子:
错误估计和锁定
索引键列顺序和锁定