首页 > 解决方案 > 使用 %%lockres%% 函数看不到任何结果

问题描述

我们在系统中遇到了死锁,死锁图显示了这种等待资源的格式。

waitresource="KEY: 500:xxxxxxxxxx (f4d477997e11) waitresource="KEY: 500:xxxxxxxxxx (8d4830b45673)"

现在受害者和获胜者都有相同的 HOBTID 并且指向同一个对象 - 在我们的例子中,表上的非聚集索引。只有哈希值不同,所以我猜测它的不同行。

当我使用

select *,%%lockres%%
from   dbo.myTabke 
where    %%lockres%% IN('(f4d477997e11)','(8d4830b45673)')

现在这不会产生任何结果。

此外,我的索引本身(即我的死锁等待资源)也有按此顺序排列的列 -

test_NonClustIndex(colA, col B, colC) 我会话中的语句(在同一个表上更新和选择)具有如下谓词

其中 colA = @a 和 colB = @b 和 colC = @c。

现在对于获胜者和受害者会话,@a 和 @b 是相同的值。只有@c 不同。

如果我将索引的顺序翻转到 test_NonClustIndex(colC, colA, col B),我能避免死锁吗?

表上还有其他索引未在死锁图上显示为等待资源。

标签: sql-server-2014waitdatabase-deadlocksnon-clustered-index

解决方案


关于找不到%%lockres%%值,您需要为非聚集索引指定索引提示,以便返回非聚集键的哈希而不是聚集键:

--clustered key hashes
SELECT *,%%lockres%%
FROM dbo.myTabke
WHERE %%lockres%% IN('(f4d477997e11)','(8d4830b45673)');

--non-clustered key hashes
SELECT *,%%lockres%%
FROM dbo.myTabke WITH(INDEX=test_NonClustIndex)
WHERE %%lockres%% IN('(f4d477997e11)','(8d4830b45673)');

我不能说在没有额外细节的情况下更改非聚集索引键顺序是否有助于消除死锁,但我不希望这是解决方案。将死锁 xml 添加到您的问题中。


推荐阅读