And*_*ykh 2 sql-server sql-server-2008-r2
我正在查看死锁,当两个进程在同一个表上执行 UPDATE 语句时会发生这种情况。这两个事务都是隐式的,这意味着它们仅跨越当前语句,这反过来意味着我看到的锁不是先前语句的结转。
死锁涉及两个锁和两个进程。两个锁之一是表中的页锁(一个进程有更新锁,另一个需要意图排他锁),第二个是表聚簇索引上的键锁(一个进程有排他锁,另一个进程需要更新锁)。
现在,在两个 UPDATE 语句中更新的字段都不是聚集索引的一部分。
不过,我想知道这个聚集索引有大量重复值的事实是否会导致死锁?
我很抱歉没有发布死锁跟踪、更新语句、表和索引的定义,有太多需要混淆的地方。
我的问题不是如何解决我的死锁,我的问题是关于原则上低基数聚集索引对死锁概率的影响。
两个锁之一是表中的页锁(一个进程有更新锁,另一个需要意图排他锁)
这意味着该表足够大,以至于引擎决定使用页粒度锁来发现要更新的行。然后,当它“深入”以实际将更新应用到行时,会发生死锁,因为这两个更新都将行到更新定位在同一页面上。您可以强制行锁,也可以禁用表上的页锁,但真正的问题是 UPDATE 的 WHERE 子句看起来是不可 sARG 的。