mysql存储引擎如何处理死锁_mysqlInnoDB死锁解析-mysql教程

InnoDB主动检测并回滚代价最小事务以解除死锁,非故障而是正常策略;需通过索引优化、访问顺序统一、小事务拆分及应用层重试来降低死锁概率。

死锁不是InnoDB“没处理好”,而是它主动检测并牺牲一个事务

InnoDB 遇到死锁时不会卡住或无限等待,而是通过内置的死锁检测器(wait-for graph)在几毫秒内识别出循环等待,并选择一个代价最小的事务回滚——这个被回滚的事务会收到 Deadlock found when trying to get lock; try restarting transaction 错误。关键点在于:这不是故障,是正常策略。常见误解是“加了索引就不会死锁”,其实只要两个事务以不同顺序访问相同资源(哪怕都是走索引),就可能触发死锁。

典型死锁场景:UPDATE 顺序不一致 + 无覆盖索引

最常复现的死锁发生在多条件 UPDATE 或范围操作中,尤其当 WHERE 条件未命中唯一索引、或扫描路径不可预测时。例如:

-- 事务A
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1001 AND status = 'active';
-- 事务B
UPDATE accounts SET balance = balance + 100 WHERE user_id = 1002 AND status = 'active';

如果 user_id 是主键但 status 没有索引,InnoDB 可能对整个二级索引 status 进行范围扫描,锁住多个间隙(gap lock),而两个事务又交叉更新不同 user_id 行,就容易形成锁等待环。

  • 务必为 WHERE 中高频出现的非主键字段建立联合索引,例如 (status, user_id),让查询能走索引且扫描范围确定
  • 避免在事务中执行不确定扫描范围的操作,如 SELECT ... FOR UPDATE 带模糊条件(LIKE '%abc')
  • UPDATE 语句尽量只更新必要字段,减少锁升级概率(例如不要用 SET *)

如何快速定位死锁原因:看 SHOW ENGINE INNODB STATUS

执行该命令后,输出末尾的 LATEST DETECTED DEADLOCK 区域才是关键。它包含:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » mysql存储引擎如何处理死锁_mysqlInnoDB死锁解析-mysql教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4007658+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4007658+
  • 本周更新: 0+
  • 最后更新: 2026-03-16