【问题标题】:No results visible with the %%lockres%% function使用 %%lockres%% 函数看不到任何结果
【发布时间】:2019-01-24 23:06:27
【问题描述】:

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

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-2014 wait database-deadlocks non-clustered-index


    【解决方案1】:

    关于找不到%%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 添加到您的问题中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2020-03-15
      • 1970-01-01
      相关资源
      最近更新 更多