sql-server-2014 - 使用 %%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),我能避免死锁吗?
表上还有其他索引未在死锁图上显示为等待资源。
解决方案
关于找不到%%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 添加到您的问题中。
推荐阅读
- javascript - “未捕获的 ReferenceError:FB 未定义”聊天停止工作
- python - 为什么py转exe后没有出现GUI?
- node.js - 为什么 promisify 会导致循环花费更长的时间?
- nsis - 如何在不覆盖寄存器的情况下为 NSIS exe 生成的日志条目添加当前日期和时间的前缀?
- python - Selenium 如何获取文本的大小
- python - 七(7)行代码python中的繁荣游戏
- python - matplotlib 图例位置的有效位置列表
- qt5 - 以编程方式向 LXDE 桌面管理器发出信号以隐藏其开始面板?
- python - 如何将多索引列与独立列组合
- flutter - 将类中成员的名称作为参数传递给函数