MySQL 锁是数据库为了解决并发事务冲突而设计的机制核心目的是保证数据在多用户同时访问时的一致性和安全性。锁的类型主要取决于存储引擎InnoDB 引擎支持的锁最为丰富和复杂 。锁有哪些主要分类MySQL 的锁可以从多个维度进行划分最常用的是按锁的粒度分类 。全局锁定义锁定整个 MySQL 实例的所有表加锁后整个数据库只读 。命令FLUSH TABLES WITH READ LOCK。场景全库逻辑备份确保备份期间数据不被修改 。注意InnoDB 备份通常使用--single-transaction实现无锁备份不推荐使用全局锁 。表级锁定义每次操作锁住整张表粒度中等 。类型表锁读锁共享锁和写锁排他锁手动使用LOCK TABLES加锁 。元数据锁 (MDL)自动加锁保护表结构防止表结构被修改时数据不一致 。意向锁自动加锁用于协调表级锁与行级锁的冲突检测 。特点开销小、加锁快但并发度低适合读多写少的场景 。行级锁定义每次操作锁住对应的行数据粒度最小 。引擎仅 InnoDB 引擎支持 。类型记录锁(Record Lock)锁定单条记录防止 update 和 delete 。间隙锁(Gap Lock)锁定索引记录之间的间隙不包含记录本身防止其他事务插入新行 。临键锁(Next-Key Lock)记录锁 间隙锁的组合锁定左开右闭区间是 InnoDB 默认行锁算法 。特点并发度高、冲突概率低但开销大可能出现死锁 。行锁和间隙锁怎么工作行锁是 InnoDB 高并发的核心其行为受事务隔离级别影响显著 。记录锁的触发当 SQL 语句命中索引时InnoDB 会锁定索引上的具体记录 。如果 SQL 未命中索引InnoDB 无法定位具体记录会对全表所有索引记录加锁效果等同于表锁 。间隙锁的作用解决幻读在可重复读 (RR) 隔离级别下通过锁定间隙防止其他事务在范围内插入新行 。兼容性多个事务可以同时持有同一个间隙的间隙锁不会互相阻塞 。互斥性间隙锁与插入意向锁互斥会阻塞插入操作 。隔离级别对锁的影响读已提交 (RC)仅存在记录锁间隙锁关闭并发性能更高 。可重复读 (RR)行锁 间隙锁 临键锁完整生效彻底解决幻读问题 。串行化所有查询自动加共享锁所有写操作自动加排他锁并发性能极差 。怎么避免死锁和优化锁性能锁冲突和死锁是高并发场景下的常见问题可以通过以下策略进行优化 。减少锁持有时间控制事务大小仅包含核心操作如锁定数据、更新数据。非核心操作如日志记录、通知推送移到事务外执行 。及时提交或回滚事务避免长时间未提交 。缩小锁粒度为查询条件字段建立索引确保 SQL 能命中索引避免全表扫描加锁 。使用唯一索引的等值查询使临键锁降级为记录锁减少锁定范围 。避免执行无 WHERE 条件的 UPDATE/DELETE 语句 。统一锁顺序多个事务操作同一组表/行时按固定顺序锁定资源避免循环等待导致死锁 。例如转账场景中所有事务均按 user_id 升序锁定账户 。合理选择锁策略悲观锁适用于写多读少、冲突概率高的场景如银行转账、秒杀库存更新。乐观锁适用于读多写少、冲突概率低的场景如商品浏览量统计。读写分离高读并发场景采用主从复制架构读请求路由到从库 。排查锁问题使用show processlist查看当前进程与锁等待状态 。使用show engine innodb status查看死锁日志和锁结构 。MySQL 8.0 可使用performance_schema.data_locks和data_lock_waits精准查询锁资源 。掌握 MySQL 锁机制是保障高并发业务稳定运行的关键需结合具体业务场景并发量、冲突概率、一致性要求灵活选择锁策略 。锁冲突排查的实操SQL这是一份针对生产环境的 MySQL 锁冲突与死锁排查实操 SQL 清单。在 MySQL 8.0 环境中performance_schema和sys库提供了比传统SHOW ENGINE INNODB STATUS更结构化、更易读的视图。以下方案按“发现异常 - 定位源头 - 分析原因 - 紧急处理”的逻辑梳理。第一阶段快速感知锁争用当业务出现接口超时、响应变慢时先确认是否由锁引起。1. 查看当前行锁等待概况-- 关注 innodb_row_lock_current_waits 0 的情况SHOW STATUS LIKE innodb_row_lock%;关键指标Innodb_row_lock_current_waits: 当前正在等待的行锁数量。如果持续大于 0说明有阻塞。Innodb_row_lock_time_avg: 平均等待时间。如果数值很大说明持有锁的事务执行很慢或发生了死锁重试。2. 实时查看谁在等谁最核心视图MySQL 8.0 推荐使用sys.innodb_lock_waits视图它自动关联了阻塞者和被阻塞者的信息。SELECTwait_pid AS waiting_thread_id, -- 被阻塞的线程IDwait_query AS waiting_sql, -- 被阻塞的SQL语句block_pid AS blocking_thread_id, -- 阻塞者的线程IDblock_query AS blocking_sql, -- 阻塞者当前持有的SQL可能为NULL见下文wait_age_secs AS wait_seconds, -- 已等待秒数locked_table, -- 涉及的表locked_index -- 涉及的索引FROM sys.innodb_lock_waits;注意blocking_sql可能为NULL。这是因为阻塞事务可能已经执行完了 SQL 语句但尚未提交Commit此时它处于“空闲但持锁”状态。第二阶段深度定位“隐形”阻塞者如果上一步中blocking_sql为空或者你需要更详细的上下文需结合performance_schema进行深挖。3. 查找长事务常见的锁持有者很多锁等待是由一个忘记提交的长事务引起的。SELECTtrx_id,trx_state,trx_started,TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_sec, -- 事务运行时长trx_mysql_thread_id, -- 对应 SHOW PROCESSLIST 的 Idtrx_query -- 当前正在执行的SQLFROM information_schema.innodb_trxORDER BY duration_sec DESC;排查重点找出duration_sec很大且trx_state为RUNNING或LOCK WAIT的事务。如果trx_query为 NULL说明事务处于空闲状态但未提交它就是潜在的锁持有者。4. 关联线程获取完整历史 SQL当阻塞者处于空闲状态时需要通过performance_schema.events_statements_current或history表找到它最后执行的 SQL。-- 假设已知阻塞者的线程ID (thread_id) 为 12345SELECTTHREAD_ID,EVENT_NAME,SQL_TEXT,TIMER_START,TIMER_ENDFROM performance_schema.events_statements_historyWHERE THREAD_ID 12345ORDER BY TIMER_START DESCLIMIT 5; -- 查看该线程最近执行的几条SQL逻辑通常最后一条UPDATE/DELETE/SELECT...FOR UPDATE就是加锁的根源。第三阶段死锁专项排查死锁Deadlock与锁等待不同它是循环依赖InnoDB 会主动回滚其中一个事务。5. 查看最近一次死锁详情这是排查死锁最直接的方式无需开启额外日志。SHOW ENGINE INNODB STATUS\G阅读技巧搜索关键字LATEST DETECTED DEADLOCK。找到(1) TRANSACTION和(2) TRANSACTION两个块。对比HOLDS THE LOCK(S)持有锁和WAITING FOR THIS LOCK TO BE GRANTED等待锁。核心结论事务 A 持有资源 1 等待资源 2事务 B 持有资源 2 等待资源 1。记录两个事务最后执行的 SQL以及它们使用的索引Index Name。6. 开启全量死锁日志生产环境建议默认只记录最后一次死锁高频死锁场景下容易丢失现场。建议在my.cnf中配置[mysqld]innodb_print_all_deadlocks 1log_error /var/log/mysql/mysqld.log作用每次发生死锁都会写入错误日志方便事后回溯分析规律。第四阶段紧急处理与解锁警告生产环境 Kill 会话需谨慎务必先确认该会话非核心业务关键路径。7. 终止阻塞会话一旦定位到罪魁祸首的线程 IDblocking_thread_id或trx_mysql_thread_idKILL [thread_id];后果该事务会被回滚持有的锁立即释放其他等待的事务得以继续执行。替代方案如果无法直接 Kill如权限不足或担心数据一致性可尝试联系应用层重启服务或等待innodb_lock_wait_timeout默认 50s超时自动回滚。8. 检查元数据锁MDL阻塞如果SHOW PROCESSLIST中看到大量状态为Waiting for table metadata lock这通常是因为有人在执行 DDL如ALTER TABLE或长事务未提交。-- 查看 MDL 等待关系SELECTOBJECT_SCHEMA,OBJECT_NAME,LOCK_TYPE,LOCK_STATUS,OWNER_THREAD_ID,REQUESTING_THREAD_IDFROM performance_schema.metadata_locksWHERE LOCK_STATUS PENDING;解决找到持有 MDL 锁的长事务并 Kill 掉或者等待 DDL 执行完成。排查总结流程图报警/卡顿 → 查SHOW STATUS LIKE innodb_row_lock%确认有等待。找关系 → 查sys.innodb_lock_waits拿到waiting_thread和blocking_thread。找SQL若blocking_sql有值 → 直接分析该 SQL 的索引和执行计划。若blocking_sql为空 → 查information_schema.innodb_trx找长事务 → 查performance_schema.events_statements_history找最后一条 SQL。定原因是无索引导致的全表扫描锁→ 加索引。是间隙锁冲突→ 调整隔离级别或优化查询条件为唯一索引等值查询。是死锁→ 查SHOW ENGINE INNODB STATUS统一业务层的加锁顺序。解故障 →KILL阻塞线程或优化代码后重新部署。
企业数字化 ERP 产品动态
相关推荐
【Jetpack Compose娓娓道来】第1课:从介绍开始 一、一个让无数Android开发者头疼的老问题
先看一段你可能非常熟悉的代码。假设我们要实现一个最简单的功能:点击按钮,让一段文字显示或隐藏。
用传统XML View的方式,你需要这样做:
在 activity_main.xml 里定义布局:… · 2026/9/24 17:48:41
PHP数据建模的术语大全的庖丁解牛 总纲
PHP的数据建模,本质就是面向对象思想落地到业务数据:把业务里的实体(用户、订单、商品)抽象成模型,打通PHP代码和MySQL数据库。和Java的OOP建模同源,但PHP有自身特点:常用Laravel/ThinkPHP… · 2026/9/24 17:48:41
大功率PD充电宝EMC整改核心难点与标准化落地解决方案 摘要:在大功率PD快充移动电源研发中,普遍存在功能调试正常、EMC摸底测试全面超标的行业难题,集中体现在传导骚扰、辐射骚扰、ESD静电抗扰度不达标。多数硬件团队习惯通过堆叠磁珠、电容、防护器件优化指标,最终引发快充握手失效、… · 2026/9/24 17:48:35
仓颉编程环境怎么搭:编译器、CodeArts IDE与DevEco三选一完整指南 仓颉编程环境怎么搭:编译器、CodeArts IDE与DevEco三选一完整指南 【免费下载链接】仓颉编程基础及应用_陈波_何睿_重庆大学 《仓颉编程基础及应用》,清华大学出版社,2025年9月第1版: 1. 随书源代码; 2. PPT; 3.在线扩… · 2026/9/24 18:15:29
WinForms图层化绘图板实战:从画完就丢到可编辑可回退 简介:这是一份面向C#初学者与Winform桌面开发练习者的绘图程序源码,基于.NET Framework构建,可用于学习图层管理、图形绘制与图像保存等典型桌面绘图场景。压缩包共46个文件,约529KB,以cs源码、resx资源、config配置、… · 2026/9/24 18:15:23
Medical | 药品追溯系统实施的成本解构 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 18:15:23
2026.9.23学习周报 本周,我继续小福星电商平台项目研发综合实训,主要围绕需求文档完善、专业工具学习以及项目优化整改展开学习,收获颇丰,同时也认清了自身存在的不足,现将本周学习情况总结如下。9月21日,我继续完善小福星电商… · 2026/9/24 18:15:23
CActor断路器与背压控制:5种策略守护高并发系统不崩的最终方案 CActor断路器与背压控制:5种策略守护高并发系统不崩的最终方案 【免费下载链接】cactor 项目地址: https://gitcode.com/Cangjie-SIG/cactor
高并发系统最怕两件事:下游服务雪崩式故障,以及消息洪流冲垮消费者。CActor 作为基于仓颉语… · 2026/9/24 18:15:23
基于CNN的猫狗图像识别:从数据准备到迁移学习实战 简介:这份资源是面向Python与深度学习入门者的CNN猫狗图像识别实战项目包,适合想通过完整案例掌握卷积神经网络分类流程的学生与开发者。包内共26个文件,以jpg与png图片示例、py源码脚本、zip数据压缩包为主,另附PDF案例讲义、txt… · 2026/9/24 18:15:17
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44