在SQL Server中查找给定表被锁定的行以及锁定它们的人。

5

在 SQL Server 2008 中,有没有一种方法可以找出特定表中被锁定的行?我还想知道锁定它们的用户。


可能是 如何检查表上持有的锁定 的重复问题。 - Oded
我看到了,但是想知道如何获取被锁定的特定记录,这在那篇文章中没有提到。 - Jeff Stock
@Jeff:你可以自由地将它编辑到你的问题中。 - Andriy M
3个回答

7

sys.dm_tran_locks,如在694581中已经提到。要确定哪些行实际上被锁定,您需要了解锁定层次结构(表->行集->页面->行),并且需要破解锁定资源描述。对于表锁定,是来自sys.objects的对象ID,对于行集是sys.partitions中的partition_id,对于页面是实际页面ID。对于行,取决于它是堆还是B树,但是您可以使用(未记录的)%%lockres%%虚拟列找到该行。如果这太简单了,您还需要考虑范围锁定,因为它们会影响指定范围内的所有行。

当您将导航物理层次结构的难度相加,特别是涉及页面锁定时,加上锁定兼容性矩阵的复杂模型,由哈希冲突添加的复杂性,并考虑您正在查看的锁定更改的速度,我会说,在最好的情况下,您只能做出非常粗略的近似值。除了进行特定问题调查外,深入研究这一点没有什么意义。如果有一个应用程序主动查看保持的锁定并基于所看到的信息做出任何决策,我会感到震惊。


1
以下是一个示例,说明如何在表中找到被锁定记录的主键:
SELECT <main_key>
FROM <table>
WHERE %%lockres%% IN ( select dm_tran_locks.resource_description from sys.dm_tran_locks )

0
如果您想要一种可视化工具来检测锁定,那么有一个名为 SQL lock finder 的开源工具可供使用。 您可以在以下链接找到源代码:https://github.com/LucBos/SqlLockFinder 或者在以下链接下载可执行文件:http://sqllockfinder.com SQL lock finder 可以让您了解每个会话中确切被锁定的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接