sql-server – 主键对阻塞情况的影响

我正在研究“交易和并发”,“死锁”以及相关的东西一段时间.我对这个问题有疑问.

情况是两个记录(AccountNumber AW00012597和AW00012596)由两个不同的会话更新:

>会议60:

 begin transaction
 update CustomerTest
 set ModifiedDate = getdate()
 where accountnumber = 'AW00012597'    

>会议63:

 begin transaction
 update CustomerTest
 set ModifiedDate = getdate()
 where accountnumber = 'AW00012596'

问题是当我在列AccountNumber上放置聚簇索引(或者将此列设置为PrimaryKey)时,两个事务都完成没有任何问题但是当我删除索引时(当表没有任何索引或主键时)会话63被阻止!

我想知道这背后究竟是什么原因?导致事务正在更新不同的行,并且它们在不同的行上持有“Exclusive Locks”(根据我到目前为止所读到的内容).那么聚集索引会产生什么影响呢?

预先感谢

最佳答案
Community wiki answer – 请编辑改进:

原因是当您创建索引时,或者通过将其声明为主键(在内部创建索引以强制执行约束),它会使两个更新语句都快速,并且它们可以快速完成而不会阻塞.

如果没有索引,每个查询都必须扫描所有记录以找到你在where子句中指定的内容,因此存在阻塞,我猜最终会有阻塞.或者它是锁升级:没有索引,它必须升级到表锁,这就是阻塞.您真的需要查看阻塞/死锁所占用的资源,以查看发生了什么.

转载注明原文:sql-server – 主键对阻塞情况的影响 - 代码日志