sql sqlserver 查看锁表语句

在 SQL Server 中,查看当前被锁定的表或资源,可以通过几种不同的方式来实现。这通常涉及到系统视图和动态管理视图(DMVs)。以下是一些常用的查询,可以帮助你诊断锁定情况。

1. 使用 sys.dm_tran_locks 视图

sys.dm_tran_locks 视图提供了当前执行中的所有锁定信息。你可以结合其他系统视图,如 sys.partitions 或 sys.objects,来获取被锁对象的更详细信息。

sql复制代码
SELECT   
    tl.resource_type,  
    tl.resource_database_id,  
    OBJECT_NAME(p.OBJECT_ID) AS ObjectName,  
    p.index_id,  
    tl.request_mode,  
    tl.request_status,  
    tl.request_session_id  
FROM   
    sys.dm_tran_locks tl  
    INNER JOIN sys.partitions p ON tl.resource_associated_entity_id = p.hobt_id  
WHERE   
    tl.resource_type = 'OBJECT' -- 可以根据需要更改资源类型,如 KEY, PAGE, RID 等  
ORDER BY   
    tl.request_session_id;

  

 

注意:如果 OBJECT_NAME(p.OBJECT_ID) 返回 NULL,可能是因为该锁与某些系统对象相关联,这些系统对象可能没有名称,或者因为权限问题无法访问。

2. 使用 sp_who2 和 DBCC OPENTRAN

虽然 sp_who2 和 DBCC OPENTRAN 不直接显示锁信息,但它们可以帮助你识别哪些会话(session)可能持有锁。sp_who2 显示当前活动的所有进程信息,而 DBCC OPENTRAN 显示当前数据库上的活动事务。

sql复制代码
EXEC sp_who2;  
DBCC OPENTRAN;

  

 

然后,你可以使用上面 sys.dm_tran_locks 的查询来进一步调查这些会话的锁情况。

3. 使用活动监视器

SQL Server Management Studio (SSMS) 的活动监视器提供了一个图形界面来查看当前数据库的活动,包括锁信息。你可以通过右键单击服务器名称 -> “活动监视器”来访问它,然后在“进程”或“锁”等部分查找相关信息。

4. 使用 sys.dm_exec_requests 和 sys.dm_exec_sessions

这些视图可以与 sys.dm_tran_locks 结合使用,以获取更全面的会话和请求信息,从而帮助诊断锁定问题。

sql复制代码
SELECT   
    r.session_id,  
    s.text AS sql_text  
FROM   
    sys.dm_exec_requests r  
    CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS s  
    INNER JOIN sys.dm_tran_locks tl ON r.session_id = tl.request_session_id  
WHERE   
    tl.resource_type = 'OBJECT';

 

 

SELECT
blocking_session_id AS BlockerSessionID,
session_id AS BlockedSessionID,
wait_type,
wait_time,
wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;

 

 

-- 替换下面的 58 / 59 为你实际的 session id
DBCC INPUTBUFFER(58);
DBCC INPUTBUFFER(59);

 

杀掉阻塞会话(危险操作,慎用)

KILL 58;

注意:这个查询假设你已经知道你想查看的 SQL 语句或锁类型。你可能需要根据实际情况调整 WHERE 子句。

使用这些工具和查询可以帮助你诊断和解决 SQL Server 中的锁定问题。然而,请注意,在处理生产数据库时,应谨慎行事,并尽可能在维护时段进行此类操作。

posted @ 2024-07-16 09:17  会制造BUG的程序员  阅读(3984)  评论(0)    收藏  举报