我一直在努力解决我们在生产中看到的各种死锁。我们已启用死锁跟踪。跟踪显示在 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
锁,resource
中 sp_lock
的值是被锁键的哈希值。
第一个 2
字节是键值的低 2
字节,其他字节是 hash
或值。
使用此查询找出被锁定的行:
SELECT *
FROM mytable
WHERE %%LOCKRES%% = '{0000ABCDEFAB}'
,其中字符串是来自
sp_lock
的锁定资源的值。如果这个查询返回两行,那么你遇到了一个不太可能但可能的哈希冲突,随着表大小的增加(由于生日悖论),概率会增加。