2010-01-15 145 views
4

檢查鑰匙鎖我一直在試圖解決我們所看到的在生產各種死鎖。我們啓用了死鎖跟蹤。痕跡顯示在這樣的鑰匙鎖大量阻塞:在SQL Server 2005

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 

據我瞭解,鑰匙鎖鎖住以防止插入,更新,或在該交易是做自己的插入,更新刪除記錄的指數,並刪除。

我猜有造成被請求壞的鎖壞的查詢計劃。我可以在我的開發系統上運行相同的查詢並運行sp_lock來檢查查詢所需的鎖,並在列表中看到一些KEYLOCK。如何檢查KEYLOCK鎖定的鍵的範圍?

回答

8

對於KEY鎖,的resourcesp_lock的值是密鑰的哈希值被鎖定。

第一個2字節是密鑰值的下一個2字節,其他字節是hash或值。

使用此查詢來找出行被鎖定:

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

,這裏的字符串是從sp_lock鎖定資源的價值。

如果該查詢返回兩行,然後你又遇到一個哈希碰撞這是相當不可能的,但可能,上漲的概率爲表規模的增長(由於生日悖論)。

+2

只是小紙條。這隻適用於聚簇索引或堆。如果您正在尋找熱塑成型的關鍵是在非聚集索引,你需要使用SELECT提示是這樣的:「FROM mytable的WITH(INDEX(myIndexName))」 – 2014-01-31 20:43:31

+1

對於MSSQL2014它略微變化 WHERE %% LOCKRES %% =' (0000ABCDEFAB)」 – 2016-07-05 06:40:27

2

此鏈接按說解釋如何做到這一點。這有點長,所以我不會在這裏剪切和粘貼,但是當我有機會測試它並減少它時,我會發佈一個概述,以便它永遠保存在SO上。

Forum post on finding the row being key locked