MySQL 死锁 怎么处理?

news/2025/10/21 17:05:57/文章来源:https://www.cnblogs.com/jelly12345/p/19155891

一、什么是死锁(Deadlock)

定义:

死锁是指两个或多个事务在执行过程中,互相占用资源且等待对方释放,导致事务都无法继续执行的状态。

简单例子:

事务A事务B
UPDATE t1 SET ... WHERE id=1; UPDATE t1 SET ... WHERE id=2;
(锁住 id=1) (锁住 id=2)
UPDATE t1 SET ... WHERE id=2; ← 被事务B锁住 UPDATE t1 SET ... WHERE id=1; ← 被事务A锁住

🔒 这样双方互相等待,InnoDB 检测到死锁后,会自动回滚其中一个事务(通常是锁占用资源少的),释放资源。


二、InnoDB 死锁原理

InnoDB 是 行级锁 + MVCC 的引擎,会使用不同类型的锁:

锁类型说明
共享锁 (S Lock) 允许读取,不允许写入
排他锁 (X Lock) 允许修改,不允许其他事务读/写
意向锁 (IS/IX Lock) 用于协调表锁和行锁
间隙锁 (Gap Lock) 用于防止幻读(在可重复读隔离级别下)

死锁的本质是:

事务之间的锁依赖图中形成了环。


三、死锁检测与分析

1️⃣ 自动检测

MySQL 会自动检测死锁并回滚其中一个事务,返回错误:

 
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

2️⃣ 查看死锁日志

执行:

 
SHOW ENGINE INNODB STATUS\G

在输出中查找:

 
LATEST DETECTED DEADLOCK ------------------------ *** (1) TRANSACTION: TRANSACTION 12345, ACTIVE 0 sec starting index read ... *** (2) TRANSACTION: TRANSACTION 12346, ACTIVE 0 sec starting index read ... *** WE ROLL BACK TRANSACTION (1)

你能看到:

  • 哪两个事务冲突;

  • 哪个 SQL 语句导致死锁;

  • 哪个事务被回滚。

👉 生产场景下,死锁分析一般就是从这个日志开始。


四、常见死锁场景

场景说明
1. 更新相同表的不同记录 事务A更新id=1再更新id=2,事务B反过来更新id=2再更新id=1。顺序不一致引发死锁。
2. 唯一索引冲突 + 插入 两个事务插入相同唯一键的记录,InnoDB 会隐式加锁。
3. 间隙锁冲突 可重复读隔离级别下,范围查询 + 插入导致 gap lock 竞争。
4. 外键约束 更新/删除父表、子表数据顺序不一致时,会触发隐式锁定。
5. 大事务 / 批量更新 一个事务锁住大量行,另一个事务锁少量行,可能产生循环等待。

五、死锁的危害

  • ❌ 部分事务会被强制回滚(数据未提交)。

  • ⚠️ 系统性能下降(大量事务等待 / 回滚重试)。

  • 🧨 高频死锁会导致应用报错、事务重试压力增大。

  • 🪣 如果应用层没有正确处理异常(例如直接吞掉异常),可能出现业务逻辑不一致


六、死锁的优化与避免策略

✅ 1. 保证加锁顺序一致

所有业务中操作相同表时,应固定访问顺序。

 
-- ❌ 不同事务顺序不一致 -- A: update t set ... where id=1; update t set ... where id=2; -- B: update t set ... where id=2; update t set ... where id=1; -- ✅ 改为统一顺序 id 从小到大

✅ 2. 尽量缩短事务执行时间

  • 事务只包含必要的 SQL;

  • 不要在事务中长时间等待外部资源(RPC、IO);

  • 提交要及时。

✅ 3. 为查询条件加合适索引

防止锁范围扩大(否则会锁整表或大量记录)。

✅ 4. 减少范围锁(Gap Lock)

  • 使用 READ COMMITTED 隔离级别(可减少间隙锁);

  • 或尽量使用主键/唯一索引精确查询。

✅ 5. 拆分大事务

批量更新、删除操作可以拆分为小批量提交。

✅ 6. 避免并发更新相同行

可以加版本号、状态字段等乐观锁机制(应用层控制)。

✅ 7. 捕获并重试

对死锁异常进行捕获与重试(常用于幂等事务逻辑):

 
int retry = 3; while (retry-- > 0) { try { // 执行事务逻辑 break; } catch (DeadlockLoserDataAccessException e) { if (retry == 0) throw e; } }

七、面试总结答案(标准化表达)

面试答法:

MySQL 死锁是多个事务之间互相持有并等待对方锁资源而无法继续执行的现象。
InnoDB 会自动检测死锁并回滚其中一个事务。
常见死锁场景包括不同顺序更新同一表、间隙锁冲突、外键约束等。
处理上我们可以通过:

  • 保证加锁顺序一致;

  • 缩短事务时间;

  • 为条件加索引;

  • 使用合适隔离级别(READ COMMITTED);

  • 拆分大事务;

  • 捕获异常并重试;

  • 通过 SHOW ENGINE INNODB STATUS 分析死锁日志。

死锁会导致事务回滚和性能下降,需要重点在设计阶段优化。


八、可执行的排查流程(生产建议)

 
# 查看死锁日志 SHOW ENGINE INNODB STATUS\G# 查看事务等待情况 SELECT * FROM information_schema.innodb_trx\G# 查看锁等待关系 SELECT * FROM performance_schema.data_locks; SELECT * FROM performance_schema.data_lock_waits;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis 的 @SelectProvider 是一个强大的注解,用于动态生成 SQL 语句

MyBatis 的 @SelectProvider 是一个强大的注解,用于动态生成 SQL 语句。让我详细介绍一下它的用途和使用方法。 一、@SelectProvider 的作用 主要用途:动态 SQL 构建 - 根据条件动态生成复杂的 SQL 代码逻辑控制 - 使…

跨境客服系统如何保障国际数据传输安全?

在跨境业务不断扩张的今天,客户数据的流动已经不再局限于单一国家或地区。无论是欧洲客户的售后请求,还是东南亚市场的订单咨询,都意味着企业的客服系统需要跨越多国网络,实时响应用户需求。然而,在全球数据监管趋…

物联网短信收发速成:10分钟用SMS库上手实战

物联网设备与短信通信的结合,为众多场景带来便利。本篇文章是一场技术实战分享,聚焦于如何在短短10分钟内,利用SMS库实现物联网短信的收发,让你迅速上手,开启物联网短信功能开发的大门。 近期社群不少新朋友对短信…

250922

1.菜油 关注 9785-9799一线 支撑 可能波段升势开始点 2. 20号胶 之前提到看涨 目前暂看反弹 观察后续走势 至少要破掉12585重要阻力后才看涨势继续

https://vscode-elements.github.io/components/toolbar-button/

https://vscode-elements.github.io/components/toolbar-button/Toolbar Button | VSCode Elements 漫思

npx和npm exec有什么区别

npx 和 npm exec 在功能上非常相似,甚至可以说 npx 是 npm exec 的前身。它们的核心目的都是:在不全局安装包的情况下,临时运行一个 npm 包中的可执行命令。 简要总结区别:特性 npx npm exec引入时间 npm 5.2.0(2…

【深度学习计算机视觉】10:转置卷积 - 详解

【深度学习计算机视觉】10:转置卷积 - 详解2025-10-21 17:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

2025年耳机插座厂家权威推荐榜:DC防水耳机插座,专业防水防尘设计,耐用稳定性能卓越之选

2025年耳机插座厂家权威推荐榜:DC防水耳机插座,专业防水防尘设计,耐用稳定性能卓越之选 随着智能音频设备的快速普及,耳机插座作为关键连接部件,其技术标准与性能要求日益提升。特别是在户外运动、工业应用及特殊…

2025年10月18日,工信部人才交流中心PostgreSQL认证考试完成!

2025年10月18日,由工业和信息化部人才交流中心 与 北京神脑资讯技术有限公司共同举办的PostgreSQL管理员岗位能力认证考试完成,本次考试共有35位同学参加。初级PG认证专员- PGCA(PostgreSQL Certified Associate):是…

2025年CNC加工厂家权威推荐榜:CNC精密加工/加工中心CNC/cnc电脑锣加工/铝板cnc加工/精密CNC加工源头企业综合评测

2025年CNC加工厂家权威推荐榜:CNC精密加工/加工中心CNC/cnc电脑锣加工/铝板cnc加工/精密CNC加工源头企业综合评测 行业背景与发展趋势 随着制造业向智能化、精密化方向加速转型,CNC加工技术作为现代制造业的核心支撑…

Yolo11分类模型

C#中部署 Yol11的分类模型,在C#中通过Onnx部署。其对应的输出非常简单。只有一个输出分支,该分支输出一个一维张量,表示每个类别的置信度。

市面上的开源 AI 智能体平台使用体验

最近摸了几个主流的开源 AI 智能体平台,从低代码搭建到商业变现能力都试了个遍,作为程序员,聊聊实际用下来的感受。不算深度测评,更多是从日常使用场景出发的体验分享,尽量客观,数据也都是基于公开信息和自己实测…

简支梁在荷载作用下的变形计算

用于计算简支梁在各种荷载作用下的变形。程序包括解析解和有限元数值解两种方法,并提供了可视化功能。 % 简支梁荷载作用下的变形计算 clear; clc; close all;%% 1. 参数设置 fprintf(设置梁参数和荷载条件...\n);% 梁…

混合动力电动汽车(HEV)Matlab 建模仿真

混合动力电动汽车(HEV)Matlab 建模–仿真–能量管理物理模型:发动机 + 电机 + 电池 + 车辆纵向动力学 能量管理策略:基于规则的功率分流(Rule-Based)+ 基于 PSO 的 ECMS(Equivalent Consumption Minimization S…

leetcode338. 比特位计数

leetcode338. 比特位计数338. 比特位计数 常用技巧 | 位运算我的解法:class Solution {public int[] countBits(int n) {int[] res = new int[n+1];int k = 1; //k控制当前起始的位置for(int i = 1;i <= n;++i){re…

近期 AI 领域的新发布所带来的启示

2024 年以来,AI 基础设施的快速发展过程中,PaaS 层的 AI 网关是变化最明显的基建之一。从传统网关的静态规则和简单路由开始,网关的作用被不断拉伸。用户通过使用网关来实现多模型的流量调度、智能路由、Agent 和 M…

基于 tar.gz 的自定义 安装InfluxDB

此处以 **InfluxDB 1.8.10 ** 为例,确保数据、日志、配置文件都在自定义目录下,适合生产或测试环境。 假设你希望安装到 /opt/influxdb,配置文件、数据目录、日志目录也都在这个路径下。 1. 下载 tar.gz 包 # 进入临…

2025年移动泵车厂家推荐排行榜,防汛泵车,水泵机组,应急排水泵车,柴油机泵车公司精选

2025年移动泵车厂家推荐排行榜,防汛泵车,水泵机组,应急排水泵车,柴油机泵车公司精选 随着全球气候变化加剧,极端天气事件频发,城市内涝防治和应急排水需求日益凸显。移动泵车作为防汛抢险、市政排水、工业应急等…

Oracle 触发器

触发器分类:DML触发器: 创建在表上,由DML事件触发DDL触发器: 数据库对象创建与修改时触发instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作数据库系统事件触发: 定义在数据库或者模…

论微服务架构设计及其应用(AI写作)

2016年论文题目,请围绕“论微服务架构及其应用”的论题,依次从以下三个方面进行论述: 1. 概要叙述你参与管理和开发的、采用微服务架构的软件开发项目以及你在其中所担任的主要工作。 2. 与单体架构相比较,微服务架…