在 SQL Server 2008 中,有没有一种方法可以找出特定表中被锁定的行?我还想知道锁定它们的用户。
在 SQL Server 2008 中,有没有一种方法可以找出特定表中被锁定的行?我还想知道锁定它们的用户。
sys.dm_tran_locks
,如在694581中已经提到。要确定哪些行实际上被锁定,您需要了解锁定层次结构(表->行集->页面->行),并且需要破解锁定资源描述。对于表锁定,是来自sys.objects
的对象ID,对于行集是sys.partitions
中的partition_id,对于页面是实际页面ID。对于行,取决于它是堆还是B树,但是您可以使用(未记录的)%%lockres%%
虚拟列找到该行。如果这太简单了,您还需要考虑范围锁定,因为它们会影响指定范围内的所有行。
当您将导航物理层次结构的难度相加,特别是涉及页面锁定时,加上锁定兼容性矩阵的复杂模型,由哈希冲突添加的复杂性,并考虑您正在查看的锁定更改的速度,我会说,在最好的情况下,您只能做出非常粗略的近似值。除了进行特定问题调查外,深入研究这一点没有什么意义。如果有一个应用程序主动查看保持的锁定并基于所看到的信息做出任何决策,我会感到震惊。
SELECT <main_key>
FROM <table>
WHERE %%lockres%% IN ( select dm_tran_locks.resource_description from sys.dm_tran_locks )