当where子句列中没有聚集索引时,并行更新会导致死锁

问题描述 投票:0回答:1

[我们遇到了一种情况,当试图在同一事务中两次从两个同时进行的连接更新表时,会发生死锁,并且每次在SSMS中的两个查询窗口上运行查询时,该死锁都是可重现的。 (“ AccountId”列是非聚集键)

见下文。

enter image description here

在AccountId列上创建群集密钥后,不再发生死锁。是什么原因导致这种现象?

sql-server sql-server-2005 database-deadlocks
1个回答
0
投票

在AccountId上没有索引,SQL Server必须检查每一行以查看它是否符合UPDATE的条件。

因此,第一次更新将成功,并且更新后,您在表中仅锁定了一行。第2次更新将尝试锁定所有行,并且将等待第1次更新释放该锁。它将成功获取其他行上的锁。第3次更新将尝试锁定所有行,并且将等待第2次更新中的锁释放。死锁。

© www.soinside.com 2019 - 2024. All rights reserved.