Pau*_*ams 4 sql sql-server deadlock locking
我一直在努力解决我们在生产中遇到的各种僵局.我们启用了死锁跟踪.跟踪显示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
Run Code Online (Sandbox Code Playgroud)
据我所知,键锁锁定索引,以防止在事务执行自己的插入,更新和删除时插入,更新或删除记录.
我猜测有错误的查询计划会导致请求坏锁.我可以在我的开发系统上运行相同的查询并运行sp_lock来检查查询所需的锁,我在列表中看到一些KEYLOCK.如何检查KEYLOCK锁定的键范围?
对于KEY锁定,resourcein sp_lock的值是被锁定的键的散列值.
第一个2字节是2键值的低字节,其他字节是hash值或值.
使用此查询可以找出被锁定的行:
SELECT *
FROM mytable
WHERE %%LOCKRES%% = '{0000ABCDEFAB}'
Run Code Online (Sandbox Code Playgroud)
,其中字符串是来自的锁定资源的值sp_lock.
如果此查询返回两行,那么您遇到了一个非常不可能但可能的哈希冲突,随着表大小的增加,概率会上升(由于生日悖论).