当前位置:  开发笔记 > 数据库 > 正文

如何检查表上保存的锁

如何解决《如何检查表上保存的锁》经验,为你挑选了5个好方法。

我们如何针对查询批处理检查针对哪些行应用了哪些数据库锁?

任何突出显示表行级锁定的工具?

DB:SQL Server 2005



1> mwigdahl..:

要添加到其他响应,sp_lock还可以用于在所有正在运行的进程上转储完整锁定信息.输出可能是压倒性的,但如果你想确切地知道什么是锁定的,那么它是一个很有价值的运行.我经常使用它sp_who2来快速解决锁定问题.

sp_lock根据所讨论的SQL Server 版本,有多种不同版本的"友好" 程序可在线获取.

在您的情况下,对于SQL Server 2005,sp_lock仍然可用,但已弃用,因此现在建议将sys.dm_tran_locks视图用于此类事情.您可以在此处找到如何"自己动手"sp_lock函数的示例.



2> Brian R. Bon..:

这并不能完全显示哪些行被锁定,但这可能对您有所帮助.

您可以通过运行以下命令来检查哪些语句被阻止:

select cmd,* from sys.sysprocesses
where blocked > 0

它还会告诉您每个块正在等待的内容.因此,您可以一直跟踪,以查看哪个语句导致导致其他块的第一个块.

编辑以添加来自@MikeBlandford的评论:

被阻止的列表示阻塞过程的spid.您可以运行kill {spid}来修复它.


被阻止的列表示阻塞过程的spid.您可以运行kill {spid}来修复它.

3> Somnath Mulu..:

您可以通过以下查询在表上找到当前.

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

请参见sys.dm_tran_locks

如果存在相同request_owner_type的多个实例,则request_owner_id列用于区分每个实例.对于分布式事务,request_owner_typerequest_owner_guid列将显示不同的实体信息.

例如,会话S1拥有Table1上的共享锁; 在会话S1下运行的事务T1也拥有Table1上的共享锁.在这种情况下,sys.dm_tran_locks返回的resource_description列将显示同一资源的两个实例.该request_owner_type栏会显示一个实例作为会话和其他的交易.此外,resource_owner_id列将具有不同的值.



4> 小智..:

我使用动态管理视图(DMV)来捕获锁以及锁定项的object_id或partition_id.

(必须切换到你想要观察的数据库以获得object_id)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;



5> Neil Barnwel..:

您还可以使用内置sp_who2存储过程来获取SQL Server实例上的当前阻止和阻止进程.通常,您将与SQL事件探查器实例一起运行此命令以查找阻塞进程并查看在探查器中发出的spid的最新命令.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有