我一直在努力解决我们在生产中看到的各种死锁。我们已启用死锁跟踪。跟踪显示在 KEYLOCK 上有很多阻塞,如下所示:

01/15/2010 08:25:07,spid15s,Unknown,keylock hobtid=72057594047758336 dbid=2
objectname=tempdb.dbo.MyTable indexname=IX_MyTable id=lock36977900 mode=X
associatedObjectId=72057594047758336

据我了解,keylock 锁定索引以防止在事务执行自己的插入、更新和删除时插入、更新或删除记录。

我猜有错误的查询计划会导致请求错误的锁。我可以在我的开发系统上运行相同的查询并运行 sp_lock 来检查查询所需的锁,并且我在列表中看到了一些 KEYLOCK。如何检查 KEYLOCK 锁定的键范围?

最佳答案

对于 KEY 锁,resourcesp_lock 的值是被锁键的哈希值。

第一个 2 字节是键值的低 2 字节,其他字节是 hash 或值。

使用此查询找出被锁定的行:

SELECT  *
FROM    mytable
WHERE   %%LOCKRES%% = '{0000ABCDEFAB}'

,其中字符串是来自 sp_lock 的锁定资源的值。

如果这个查询返回两行,那么你遇到了一个不太可能但可能的哈希冲突,随着表大小的增加(由于生日悖论),概率会增加。

10-06 08:33