我们如何针对查询批处理检查针对哪些行应用了哪些数据库锁?
任何突出显示表行级锁定的工具?
DB:SQL Server 2005
要添加到其他响应,sp_lock
还可以用于在所有正在运行的进程上转储完整锁定信息.输出可能是压倒性的,但如果你想确切地知道什么是锁定的,那么它是一个很有价值的运行.我经常使用它sp_who2
来快速解决锁定问题.
sp_lock
根据所讨论的SQL Server 版本,有多种不同版本的"友好" 程序可在线获取.
在您的情况下,对于SQL Server 2005,sp_lock
仍然可用,但已弃用,因此现在建议将sys.dm_tran_locks
视图用于此类事情.您可以在此处找到如何"自己动手"sp_lock函数的示例.
这并不能完全显示哪些行被锁定,但这可能对您有所帮助.
您可以通过运行以下命令来检查哪些语句被阻止:
select cmd,* from sys.sysprocesses where blocked > 0
它还会告诉您每个块正在等待的内容.因此,您可以一直跟踪,以查看哪个语句导致导致其他块的第一个块.
编辑以添加来自@MikeBlandford的评论:
被阻止的列表示阻塞过程的spid.您可以运行kill {spid}来修复它.
您可以通过以下查询在表上找到当前锁.
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_type和request_owner_guid列将显示不同的实体信息.
例如,会话S1拥有Table1上的共享锁; 在会话S1下运行的事务T1也拥有Table1上的共享锁.在这种情况下,sys.dm_tran_locks返回的resource_description列将显示同一资源的两个实例.该request_owner_type栏会显示一个实例作为会话和其他的交易.此外,resource_owner_id列将具有不同的值.
我使用动态管理视图(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;
您还可以使用内置sp_who2
存储过程来获取SQL Server实例上的当前阻止和阻止进程.通常,您将与SQL事件探查器实例一起运行此命令以查找阻塞进程并查看在探查器中发出的spid的最新命令.