尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

线上死锁解决方法

线上死锁解决方法
📅 发布时间:2026/7/18 17:10:35

线上数据库死锁完整排查 + 解决方案(MySQL 为主,通用)

一、先快速定位线上死锁(紧急止损)

1. 立刻查看死锁日志(MySQL)

-- 查看最近一次死锁详情(事务、SQL、锁、等待关系) SHOW ENGINE INNODB STATUS;

重点看LATEST DETECTED DEADLOCK区块:

  • 两个事务分别执行的 SQL
  • 各自持有什么锁、等待什么锁
  • 事务隔离级别、索引命中情况

2. 查看当前阻塞事务

-- 查看活跃事务、锁等待 SELECT * FROM information_schema.innodb_trx; -- 查看锁等待关系 SELECT * FROM information_schema.innodb_locks; SELECT * FROM information_schema.innodb_lock_waits;

3. 紧急恢复线上服务

死锁会自动回滚代价更小的事务,但高并发下会频繁触发报错,临时缓解:

  1. 杀掉长时间阻塞事务:KILL 事务ID;
  2. 临时降并发、限流、关闭高频同步接口
  3. 临时拆分大事务,缩短执行时间

二、死锁根本成因(90% 线上问题根源)

InnoDB 行锁死锁四要素:互斥、持有并等待、不可剥夺、循环等待高频场景:

  1. 多事务更新行顺序不一致(最常见) T1:update user set xx where id=1 → id=2 T2:update user set xx where id=2 → id=1 互相持有对方需要的行锁,循环等待死锁
  2. 无索引 / 索引失效,行锁升级为表锁,大量锁冲突
  3. 大事务:一次更新几十上百行,持有锁时间过长
  4. 隔离级别REPEATABLE READ(默认)存在 Gap 锁 / Next-key 锁,间隙锁冲突
  5. 同一事务多次更新同一张表不同行、批量更新乱序
  6. 读写并发:SELECT ... FOR UPDATE 悲观锁争抢

三、线上根治方案(按优先级落地)

方案 1:统一更新数据顺序(最有效,零成本)

所有业务更新多行时,强制按主键 / 唯一索引升序排序,杜绝循环等待。 错误示例:

// 随机顺序更新,极易死锁 for(Long id : randomIds){ updateById(id); }

正确写法:

// 统一升序,不会出现循环等待 ids.sort(Long::compareTo); for(Long id : ids){ updateById(id); }

批量 SQL 统一排序:

-- 批量更新前先排序ID UPDATE t SET status=1 WHERE id IN (1,3,5) ORDER BY id;

方案 2:缩小事务粒度,缩短锁持有时间

  1. 事务只放 DB 操作,移除 RPC、文件 IO、复杂计算
  2. 大事务拆分:批量更新拆成分批小事务,中间提交释放锁
  3. 避免长事务:查询、业务逻辑移出事务;禁止事务内 sleep

方案 3:保证更新条件命中索引,避免表锁

更新 / 悲观查询必须走唯一索引 / 主键,否则 InnoDB 会锁全表,并发必死锁。

-- 无索引,行锁变表锁,并发大量冲突 UPDATE order SET status=2 WHERE phone='13800000000'; -- 优化:phone加唯一索引,精准行锁

排查索引失效:EXPLAIN update xxx,看 type 是否为 ALL(全表扫描)。

方案 4:规避 Gap 间隙锁冲突(RR 隔离级)

  1. 能改用 RC 读已提交隔离级优先(无 Gap 锁,死锁大幅减少,需确认业务无幻读要求)
    transaction_isolation = READ-COMMITTED
  2. 查询更新使用精确等值主键,不使用范围条件(范围会加间隙锁)
    -- 范围条件产生Gap锁,容易死锁 UPDATE t SET num=1 WHERE id>100; -- 改为批量等值有序更新

方案 5:悲观锁优化,减少锁争抢

  1. 非强一致性场景用乐观锁替代SELECT FOR UPDATE增加 version 版本号:
    UPDATE t SET num=num-1,version=version+1 WHERE id=? AND version=?;
    更新失败重试(控制重试次数,避免风暴)
  2. 必须悲观锁时:统一加锁顺序、缩小锁定行数、尽早提交事务

方案 6:批量操作规范

  1. 禁止一次性更新上千行,分批提交(每批 50~200 条)
  2. 批量 DELETE/UPDATE 强制 ORDER BY 主键排序
  3. 批量插入用 INSERT ... ON DUPLICATE KEY,避免先查后改多行争抢

四、代码层面通用防死锁规范(Java/MyBatis)

  1. 所有多 ID 更新、批量操作,先排序主键再执行
  2. 事务方法尽量短小,禁止外部依赖耗时操作
  3. 悲观锁只锁定必要数据,不要大范围锁定
  4. 乐观锁重试机制:最多 3 次重试,失败抛异常降级
  5. 分布式场景:分布式锁(Redisson)控制行操作串行,避免跨实例死锁

五、线上监控预警(提前发现死锁)

  1. MySQL 开启死锁日志持久化:innodb_print_all_deadlocks=ON
  2. 业务埋点:捕获数据库死锁异常Deadlock found when trying to get lock,告警推送
  3. 监控指标:死锁次数、锁等待时长、长事务数量、慢 SQL
  4. 定时巡检SHOW ENGINE INNODB STATUS采集死锁日志入库分析

六、死锁异常兜底处理(程序降级)

捕获死锁异常后重试(短重试间隔,限制次数):

// 伪代码 int retry = 0; while(retry < 3){ try{ db.transaction(); break; }catch(DeadlockException e){ retry++; Thread.sleep(10); } } if(retry >=3) throw BusinessException("操作繁忙,请重试");

七、快速排查流程总结(线上应急步骤)

  1. 业务报错出现死锁 → 执行SHOW ENGINE INNODB STATUS拿到死锁两条 SQL
  2. 核对两条 SQL 更新 ID 顺序是否相反 → 统一排序修复
  3. EXPLAIN 检查是否无索引导致表锁 → 加索引
  4. 查看事务是否过长 → 拆分大事务
  5. 范围更新过多 Gap 锁 → 切换 RC 隔离或改用等值批量有序更新
  6. 临时限流止损,上线修复代码后观察死锁告警是否归零

相关新闻

  • 5个实用Python开源项目解析与应用指南
  • 2026实测豆包视频去水印方法,豆包能否去除视频水印及合法方式汇总
  • 秀英区伯爵金饰回收实测,连锁门店盘点,逸程全海口四区可预约上门 - 全城热点

最新新闻

  • TI Cortex-R VIM中断向量表初始化与ECC测试实战指南
  • 2026泸州噪音检测怎么选?环境噪音检测TOP 工业 + 工地 + 住宅 + 交通全场景 附电话地址 - 中安检测集团
  • 三极管工作原理与检测全攻略
  • 2026揭阳黄金回收白银回收铂金回收中检持证鉴定师铂金银饰高价回收门店联系方式推荐
  • 晶振原理与应用:电子设备频率稳定的核心技术
  • 2026文山别墅自建施工怎么选?TOP 砖混 + 框架 + 轻钢 + 庭院一体化 附电话地址 - 中检检测集团

日新闻

  • 宝珀中国官方售后服务中心|官方热线和维修地址权威信息声明(2026年7月更新) - 宝珀官方售后服务中心
  • # 2026年北京知识产权律师推荐怎么选?看这五点关键不踩雷 - 本地品牌推荐
  • 2026实测教程:生成的拼豆图纸不满意怎么修改才省事 - 省事研究所

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号