高并发下如何避免死锁¶
一、死锁四个条件¶
- 互斥。
- 持有并等待。
- 不可剥夺。
- 循环等待。
二、MySQL 死锁场景¶
- 两个事务以不同顺序锁相同行。
- 间隙锁冲突。
- 唯一索引插入冲突。
三、避免方法¶
1. 固定加锁顺序¶
所有事务按相同顺序访问行:
2. 缩短事务¶
- 事务里不要做远程调用。
- 批量操作拆小。
3. 降低隔离级别¶
RR 改 RC,减少间隙锁。
4. 索引¶
WHERE 条件走索引,避免锁全表。
5. 一次锁够¶
批量操作一次锁完,不要多次。
6. 超时设置¶
超时自动回滚。
四、排查¶
看 LATEST DETECTED DEADLOCK 部分。
五、总结¶
固定顺序、短事务、索引、超时。
高频
死锁不是靠 DBA 解决,是靠业务设计。固定顺序最有效。