代码之家  ›  专栏  ›  技术社区  ›  Paul Williams

正在检查SQL Server 2005中的键锁

  •  4
  • Paul Williams  · 技术社区  · 16 年前

    我一直在努力解决我们在生产中看到的各种僵局。我们启用了死锁跟踪。这些痕迹显示了对钥匙锁的大量阻塞,如下所示:

    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检查所需的锁,然后在列表中看到一些键锁。如何检查钥匙锁锁定的钥匙范围?

    2 回复  |  直到 16 年前
        1
  •  8
  •   Quassnoi    16 年前

    为了 KEY 锁,的值 resource 在里面 sp_lock 是要锁定的密钥的哈希值。

    第一 2 字节数较低 二 键值的字节,其他字节是 hash 还是价值。

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

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

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

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

        2
  •  2
  •   Tom H zenazn    16 年前

    这个链接据说解释了如何做。它有点长,所以我不打算剪切粘贴在这里,但是当我有机会测试它并将其削减时,我会发布一个概述,这样它就永远保存了下来。

    Forum post on finding the row being key locked