如何分析SQL存储过程锁等待_使用系统动态视图排查

张开发
2026/4/12 21:21:32 15 分钟阅读

分享文章

如何分析SQL存储过程锁等待_使用系统动态视图排查
查锁等待应优先使用sys.dm_exec_requests和sys.dm_tran_locks前者定位阻塞会话与等待类型如LCK_M_U后者结合sys.dm_exec_sessions识别持锁者及锁级别KEY/PAGE/OBJECT避免误判WAITFOR等非锁等待。查锁等待直接看 sys.dm_exec_requests 和 sys.dm_tran_locksSQL Server 里查存储过程卡住、长时间不返回八成是锁等待。别急着重启或杀会话先确认是不是真被锁了。核心就两个动态管理视图sys.dm_exec_requests 显示当前正在执行的请求含阻塞链sys.dm_tran_locks 显示谁持有什么锁、谁在等什么锁。关键字段要盯住blocking_session_id值 0 表示被这个会话阻塞、wait_type比如 LCK_M_U 就是等更新锁、statussuspended 才是真卡住running 可能只是慢。常见错误现象只查 sys.dm_exec_sessions 看连接数漏掉真正阻塞源头或者只看 sys.dm_os_waiting_tasks但没关联到具体 SQL 文本找不到是哪个存储过程在等。先跑 SELECT session_id, blocking_session_id, wait_type, wait_time, last_wait_type, status, command, sql_handle FROM sys.dm_exec_requests WHERE blocking_session_id 0 OR wait_type IS NOT NULL拿到 sql_handle 后用 sys.dm_exec_sql_text() 查出实际语句SELECT text FROM sys.dm_exec_sql_text(codesql_handle)如果看到 wait_type 是 LCK_M_SCH_M说明有人在改表结构比如加列整个表都动不了——这比普通行锁更致命定位持锁者必须连查 sys.dm_tran_locks sys.dm_exec_sessions知道谁被堵了还得知道谁在堵路。单看 sys.dm_tran_locks 只能看到锁资源比如 OBJECT: 5:123456789:0看不出是哪个会话、哪个用户、执行的什么语句。必须和 sys.dm_exec_sessions 关联才能还原现场。注意 request_session_id 是锁请求方等锁的resource_description 里的对象 ID 要转成表名用 OBJECT_NAME() 查别硬记数字。 ARTi.PiCS ARTi.PiCS是一款由AI驱动的虚拟头像生产器可以生成200多个不同风格的酷炫虚拟头像

更多文章