检查SQL Server 2005中的KEYLOCK

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锁定的键范围?

Qua*_*noi 8

对于KEY锁定,resourcein sp_lock的值是被锁定的键的散列值.

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

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

SELECT  *
FROM    mytable
WHERE   %%LOCKRES%% = '{0000ABCDEFAB}'
Run Code Online (Sandbox Code Playgroud)

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

如果此查询返回两行,那么您遇到了一个非常不可能但可能的哈希冲突,随着表大小的增加,概率会上升(由于生日悖论).

  • 只是小记.这仅适用于聚簇索引或堆.如果您要使用的密钥是非聚集索引,则需要使用SELECT提示,如下所示:'FROM myTable WITH(INDEX(myIndexName))' (2认同)