0

0

SQL 锁等待过多的排查方法

冷漠man

冷漠man

发布时间:2026-01-20 15:43:02

|

319人浏览过

|

来源于php中文网

原创

SQL锁等待过多表现为查询变慢、事务卡住等,需先确认锁等待状态,再定位阻塞会话与持有锁源头,分析锁类型、SQL逻辑及事务设计问题。

sql 锁等待过多的排查方法

SQL 锁等待过多,通常表现为查询变慢、事务卡住、应用响应延迟甚至超时。核心思路是:先确认锁等待是否存在及严重程度,再定位被阻塞的会话和持有锁的源头,最后分析锁类型、SQL逻辑与事务设计问题。

查当前锁等待状态

快速判断是否有活跃的锁等待:

  • MySQL:执行 SELECT * FROM information_schema.INNODB_TRX 查看运行中的事务;配合 SELECT * FROM information_schema.INNODB_LOCK_WAITS(5.7+)或 SHOW ENGINE INNODB STATUS\G 中的 LATEST DETECTED DEADLOCK 和 TRANSACTIONS 部分,识别阻塞链
  • PostgreSQL:查 pg_stat_activity 过滤 wait_event_type = 'Lock',再关联 pg_lockspg_stat_activity 找出 blocking_pid
  • SQL Server:用 sys.dm_exec_requestsblocking_session_id > 0 的会话,再通过 sys.dm_tran_locks 关联资源锁定详情

定位阻塞源头 SQL 和事务

仅知道“谁在等”不够,必须找到“谁在占着不放”:

  • 检查持有锁的会话是否执行了未提交的 DML(如 UPDATE/DELETE 无 WHERE 或未 COMMIT)
  • 查看该会话的 trx_started(MySQL)或 backend_start / xact_start(PG/SQL Server),判断事务是否异常长
  • SHOW FULL PROCESSLIST(MySQL)、SELECT query FROM pg_stat_activity WHERE pid = ?(PG)或 DBCC INPUTBUFFER(?))(SQL Server)还原被阻塞方和阻塞方的实际 SQL
  • 注意隐式事务:某些 ORM 或客户端设置 autocommit=off 后,单条语句也会开启长事务

分析锁粒度与隔离级别影响

不是所有锁都该被消灭,但需确认是否合理:

亿众购物系统
亿众购物系统

一套设计完善、高效的web商城解决方案,独有SQL注入防范、对非法操作者锁定IP及记录功能,完整详细的记录了非法操作情况,管理员可以随时查看网站安全日志以及解除系统自动锁定的IP等前台简介:  1)系统为会员制购物,无限会员级别。  2)会员自动升级、相应级别所享有的折扣不同。  3)产品可在缺货时自动隐藏。  4)自动统计所有分类中商品数量,并在商品分类后面显示。  5)邮件列表功能,可在线订阅

下载
  • RR(可重复读)下范围锁(gap lock)可能造成意外阻塞,尤其在非唯一索引条件更新时;尝试用唯一索引或降低隔离级别到 RC(读已提交)验证
  • UPDATE/DELETE 若未走索引,会升级为表锁或大量行锁,检查 EXPLAIN 结果,补上缺失索引
  • 高并发场景下,自增主键插入一般不锁表,但批量 INSERT ... ON DUPLICATE KEY UPDATE 或 REPLACE 可能引发间隙锁争用
  • 避免在事务中混用 SELECT FOR UPDATE 和普通 SELECT,尤其跨多个表时容易形成锁循环

从应用层收敛常见诱因

很多锁等待本质是业务逻辑或调用方式导致:

  • 事务里做 HTTP 请求、文件读写、复杂计算——这些耗时操作让锁持有时间大幅延长
  • 重试逻辑不当:失败后未回滚就重试,导致同一行被多次加锁
  • 批量操作未分页:一次更新 10 万行 → 持锁时间长 + 日志暴涨 → 建议按主键分片,每次 1000 行内提交
  • 缓存与 DB 不一致时,频繁“先查再更”模式易产生竞争,考虑改用原子操作(如 UPDATE ... SET count = count + 1)或乐观锁

锁等待不是故障,而是并发协作的信号。重点不在消除锁,而在缩短锁持有时间、缩小锁范围、明确事务边界。定期做慢事务审计、关键路径 SQL 走查、压测时观察锁等待指标,比出问题再救火更有效。

相关专题

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

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

683

2023.10.12

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

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

321

2023.10.27

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

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

348

2024.02.23

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

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

1095

2024.03.06

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

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

357

2024.03.06

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

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

677

2024.04.07

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

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

575

2024.04.29

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

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

417

2024.04.29

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

3

2026.01.20

热门下载

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

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 804人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号