有没有办法找出SQL Server 2008中特定表的哪些行被锁定?我也想知道锁定它们的用户。
答案 0 :(得分:6)
sys.dm_tran_locks
,正如694581中已经说过的那样。要识别实际锁定哪些行,您需要了解锁定层次结构(table-> rowset-> page-> row),您需要破解锁资源描述。对于表锁,来自sys.objects
的对象ID,对于行集,是sys.partitions
的partition_id,而页面是实际的页面ID。对于行,它取决于是堆还是btree,但您可以使用(未记录的)%%lockres%%
虚拟列来查找行。如果这太简单了,您还需要考虑range locks,因为它们会影响指定范围内的所有行。
当你加入导航物理层次结构的难度时,特别是当涉及页面锁定时,使用锁compatibility matrix的复杂模型,由hash collisions添加并发症,并考虑在你所看到的锁会发生变化,我会说你最好能做一个非常粗略的近似。除了进行特定的问题调查外,没有必要深入研究这个问题。听到一个主动查看锁定的应用程序并根据所看到的信息进行任何类型的决定,我会感到震惊。
答案 1 :(得分:0)
这是一个如何在表中查找锁定记录的主键的示例:
SELECT <main_key>
FROM <table>
WHERE %%lockres%% IN ( select dm_tran_locks.resource_description from sys.dm_tran_locks )
答案 2 :(得分:0)
如果您想要视觉上的帮助来检测锁,可以使用一种称为SQL锁查找器的开源工具。 您可以在以下位置找到源:https://github.com/LucBos/SqlLockFinder 或在以下位置下载可执行文件:http://sqllockfinder.com
SQL锁定查找器概述了每个会话中确切锁定的内容。