[我们遇到了一种情况,当试图在同一事务中两次从两个同时进行的连接更新表时,会发生死锁,并且每次在SSMS中的两个查询窗口上运行查询时,该死锁都是可重现的。 (“ AccountId”列是非聚集键)
见下文。
在AccountId列上创建群集密钥后,不再发生死锁。是什么原因导致这种现象?
在AccountId上没有索引,SQL Server必须检查每一行以查看它是否符合UPDATE的条件。
因此,第一次更新将成功,并且更新后,您在表中仅锁定了一行。第2次更新将尝试锁定所有行,并且将等待第1次更新释放该锁。它将成功获取其他行上的锁。第3次更新将尝试锁定所有行,并且将等待第2次更新中的锁释放。死锁。