如何检查哪些锁在桌子上
我们如何检查哪些数据库锁应用于查询批次的哪些行?
任何突出表行级locking的工具实时?
DB:SQL Server 2005
要添加到其他响应中,还可以使用sp_lock
来转储所有正在运行的进程的完全locking信息。 输出可以是压倒性的,但如果你想知道究竟是什么被locking,这是一个有价值的运行。 我通常将它与sp_who2
一起使用,以快速解决locking问题。
在线提供了多个不同版本的“友好的” sp_lock
程序,具体取决于所讨论的SQL Server的版本。
在你的情况下,对于SQL Server 2005, sp_lock
仍然可用,但已被弃用,所以现在build议使用sys.dm_tran_locks
视图来实现这种function。 你可以在这里find一个如何“推出自己的”sp_lock函数的例子。
这并不完全显示哪些行被locking,但这可能对您有所帮助。
你可以通过运行这个来检查哪些语句被阻塞:
select cmd,* from sys.sysprocesses where blocked > 0
它也会告诉你每个块在等待什么。 因此,您可以一路追溯到哪个语句导致导致其他块的第一个块。
编辑从@MikeBlandford添加评论:
被阻塞的列表示阻塞进程的spid。 你可以运行kill {spid}来修复它。
我使用dynamicpipe理视图(DMV)来捕获锁以及locking项的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最近的命令。
您可以通过查询查找您的表上的当前锁 。
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列将具有不同的值。