
前言并发更新同一批数据时InnoDB 行锁竞争极易产生死锁数据库抛出Deadlock found when trying to get lock事务回滚业务报错。本文讲解死锁查看命令、产生原因、通用解决方案。一、查看最新死锁日志SHOW ENGINE INNODB STATUS;输出结果中LATEST DETECTED DEADLOCK段落记录完整死锁事务、锁资源、SQL 语句用于定位冲突 SQL。二、死锁产生核心原理两个事务互相持有对方需要的行锁互相等待无限阻塞MySQL 自动牺牲一个事务回滚。 示例场景 事务 A更新 id1 → 等待 id2 锁 事务 B更新 id2 → 等待 id1 锁三、高频死锁场景并发更新多条记录ID 顺序不一致复合索引范围更新产生间隙锁冲突长事务持有锁不释放其他事务排队等待批量更新未按主键有序执行。四、通用解决方案统一更新 ID 顺序最有效所有业务批量更新按主键升序执行避免交叉持有锁。-- 先排序再更新 UPDATE user SET moneymoney-100 WHERE id IN (2,1) ORDER BY id ASC;缩小事务范围缩短事务执行时间尽快释放锁尽量使用主键精准更新避免范围更新触发间隙锁业务增加重试机制捕获死锁异常自动重试高并发更新使用 RC 隔离级别减少间隙锁竞争。五、开发规范批量修改数据必须按主键有序操作拆分长事务避免大范围无索引更新。