跳转至

高并发下如何避免死锁

一、死锁四个条件

  1. 互斥。
  2. 持有并等待。
  3. 不可剥夺。
  4. 循环等待。

二、MySQL 死锁场景

  • 两个事务以不同顺序锁相同行。
  • 间隙锁冲突。
  • 唯一索引插入冲突。

三、避免方法

1. 固定加锁顺序

所有事务按相同顺序访问行:

都按 id 升序锁

2. 缩短事务

  • 事务里不要做远程调用。
  • 批量操作拆小。

3. 降低隔离级别

RR 改 RC,减少间隙锁。

4. 索引

WHERE 条件走索引,避免锁全表。

5. 一次锁够

批量操作一次锁完,不要多次。

6. 超时设置

innodb_lock_wait_timeout = 5

超时自动回滚。

四、排查

SHOW ENGINE INNODB STATUS;

看 LATEST DETECTED DEADLOCK 部分。

五、总结

固定顺序、短事务、索引、超时。

高频

死锁不是靠 DBA 解决,是靠业务设计。固定顺序最有效。