如何排查SQL查询锁等待问题_监控系统视图定位阻塞源

冬杰小哥_9165

冬杰小哥_9165

2026-04-04

973人浏览

原创

查 sys.dm_exec_requests 是SQL Server锁等待排查最直接入口,通过blocking_session_id、wait_type、wait_time等字段定位阻塞链,需结合sys.dm_tran_locks、DBCC INPUTBUFFER及事务视图综合分析。

如何排查sql查询锁等待问题_监控系统视图定位阻塞源

查 sys.dm_exec_requests 看当前阻塞链

SQL Server 里锁等待最直接的入口就是这个动态管理视图,它能告诉你谁在等、等谁、等了多久、执行什么语句。关键字段:blocking_session_id(非零说明被阻塞),wait_type(如 LCK_M_U、LCK_M_S 表示更新/共享锁等待),wait_time(毫秒级,>0 就真卡着了)。

实操建议:

  • 优先过滤 status = 'suspended' 或 wait_type LIKE 'LCK%' 的行,排除空闲或 CPU 等待
  • session_id 和 blocking_session_id 要一起查,避免只看等待方漏掉根因会话
  • 别只依赖 command 字段——它可能截断,真正语句得用 sys.dm_exec_sql_text(sql_handle) 拿完整文本
  • 如果 blocking_session_id = 0 但 wait_type 是锁类型,可能是自己锁自己(比如未提交事务里重复更新同一行)

连查 sys.dm_tran_locks 定位具体资源冲突

sys.dm_exec_requests 告诉你“谁卡住了”,sys.dm_tran_locks 才告诉你“卡在哪条记录/哪个页/哪张表”。重点看 resource_type(如 OBJECT、PAGE、KEY)、resource_description(比如 database_id:5 object_id:123456789 page_id:1234),再结合 request_mode(S 共享,X 排他)判断兼容性。

实操建议:

  • 把 sys.dm_tran_locks 和 sys.dm_exec_requests 按 request_session_id 关联,才能把“等待会话”和“它想拿的锁资源”对应上
  • resource_description 里如果是 KEY 类型,通常带一个哈希值(如 (8194443284a0)),没法直接反查行数据,但能确认是行级锁争用
  • 注意 request_status:不是所有锁都是 GRANT 状态,WAIT 才是真卡住;CONVERT 表示正在升级锁(比如从 U 升到 X),也可能卡住

用 DBCC INPUTBUFFER(session_id) 看阻塞源头语句

有时候 sys.dm_exec_requests 里查不到完整 SQL,或者会话已断开但锁还挂着,DBCC INPUTBUFFER 就是兜底方案——它读的是会话最后一次发来的完整命令缓冲区,哪怕语句执行完了、连接断了,只要事务没提交,缓冲区内容还在(有一定时效性,但比啥都没有强)。

实操建议:

  • 必须传真实 session_id,不能传 blocking_session_id ——后者可能已结束,DBCC INPUTBUFFER 会报错
  • 结果里的 EventInfo 列就是原始语句,注意检查是否有隐式事务(比如没写 BEGIN TRAN 但开了 SET IMPLICIT_TRANSACTIONS ON)
  • 如果返回空或只有 COMMIT/ROLLBACK,说明阻塞源语句早就执行完,但事务没关,得顺藤摸瓜找前面的 BEGIN TRAN

警惕 tempdb 争用和未提交事务残留

很多锁等待看着像业务表冲突,其实是 tempdb 里排序、哈希、临时表引发的 ALLOC_UNIT 或 PAGE 锁;还有更隐蔽的:应用层异常中断后,连接断了但事务没回滚,锁一直占着,session_id 在 sys.dm_exec_sessions 里都查不到,只能靠 sys.dm_tran_active_transactions + sys.dm_tran_database_transactions 联查。

实操建议:

  • 查 sys.dm_db_task_space_usage 看哪些会话在 tempdb 分配最多空间,配合 session_id 反推源头
  • 运行 SELECT * FROM sys.dm_tran_active_transactions WHERE transaction_state = 2(active 状态),再关联 sys.dm_tran_database_transactions 看是否挂在某个数据库上
  • 不要只盯着 sys.dm_exec_requests 里 status = 'running' 的会话——真正的问题往往藏在 sleeping 但 open_transaction_count > 0 的连接里

锁等待排查最难的不是找语句,而是确认“谁该为这个未提交事务负责”。应用日志、SQL Server Agent 作业历史、甚至网络抓包,有时比 DMV 更快定位到那个忘了加 COMMIT 的存储过程调用点。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4663

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

951

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1229

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6641

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3383

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6620

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9121

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1230

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1072

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习