我有一份僵局报告告诉我存在涉及的冲突
waitresource="KEY: 9:72057632651542528 (543066506c7c)"
我可以看到这个:
<keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528">
<resource-list>
元素内。
我希望能够找到键的实际值(例如 id = 12345)。我需要使用什么 SQL 语句来获取该信息?
您有 hobt_id,因此以下查询将识别该表:-
然后,您可以运行以下语句来识别表中的行(如果它仍然存在):-
但是请注意上面的语句,它会扫描目标表,因此在 READ UNCOMMITTED 中运行并监视您的服务器。
这是 Grant Fritchey 撰写的关于 %%LOCKRES%% 的文章 - http://www.scarydba.com/2010/03/18/undocumented-virtual-column-lockres/
这是我自己博客中关于使用 %%LOCKRES%% 从扩展事件中识别行的文章:- https://dbafromthecold.wordpress.com/2015/02/24/identifying-blocking-via-extended-events/
@Kin、@AaronBertrand 和 @DBAFromTheCold 的答案很棒,而且很有帮助。我在测试期间发现的一条重要信息是,在查找(通过索引查询提示)时,您需要使用从
sys.partitions
给定返回的索引。此索引并不总是 PK 或聚集索引。HOBT_ID
%%lockres%%
例如:
这是使用每个答案中的片段修改的示例脚本。
这是对DBAFromTheCold和Aaron Bertrand已经发布的答案的补充。
微软仍然留下
%%lockres%%
了未记录的功能。以下是可以帮助您的脚本:
另请参阅这篇出色的博客文章:可疑死锁和不那么合乎逻辑的锁的奇怪案例
对不起,已经在研究这个答案,并在另一个出现时发布。添加为社区 wiki 只是因为它是一种略有不同的方法并添加了一些其他信息。
543066506c7c
本质上是主键的散列,您可以使用以下动态 SQL 检索该行(以及可能存在散列冲突的任何行):当然,您可以在没有动态 SQL 的情况下执行此操作,但这为您提供了一个很好的片段或存储过程模板,您可以在其中插入值,如果这是您经常解决的问题。(你也可以参数化表名,你也可以构建 KEY: 字符串的解析来动态地为你确定一切,但我认为这可能超出了本文的范围。)