在SQL Server中,复合主键是否会增加死锁的可能性?

Sak*_*o73 8 sql sql-server

我想知道,无论是因为增加了行锁定,还是因为增加了持有锁的时间,在表上定义复合主键会增加在更新时遇到死锁的可能性一旦?

感谢您的任何帮助.

Mic*_*Sim 5

如果您正在使用复合PK并且并行插入大量数据,则可能会受到资源哈希冲突的影响.对于一个真实世界的例子,请参阅"可疑僵局和不那么逻辑锁的奇怪案例".

为了解释资源哈希冲突,我将引用Remus Rusanu的"%% lockres %% collision probability magic marker:16,777,215"(推荐阅读):

SQL Server中的锁管理器不知道它锁定了什么,它只是锁定'资源'(基本上是字符串).这是更高级别组件的工作,例如存储引擎的访问方法,将"资源"呈现给锁管理器并请求所需的锁.当锁定堆或b树中的行时,存储引擎将从记录标识符合成"资源".由于这些资源的长度有限,因此存储引擎必须将密钥的有效长度减少到允许向锁管理器提供的最大长度,这意味着记录的密钥将减少到6个字节.这是通过将密钥散列为6字节散列值来实现的.

[...]

在6个字节上有281,474,976,710,656个不同的可能值.这是一个相当大的数字?实际上并不是那么大.[...]因此,SQL %% lockres %%哈希将生成两个具有相同哈希值的记录,其中50%的概率在表中,任何表中只有16,777,215条记录.