以下是 MySQL 避免和解决死锁的 核心实战方案,基于最新生产环境经验总结,分为 预防措施、应急处理 和 根治方案 三部分:
一、避免死锁:5 大黄金法则(预防)
策略 | 具体操作 | 原理说明 |
---|---|---|
1. 统一资源访问顺序 | 所有事务按固定顺序操作表和行(如先更新订单表再更新库存表) | 消除循环等待链,典型场景:多表操作 |
2. 事务拆分短小精悍 | 长事务拆分成多个短事务(如 1000 行数据分 10 次提交),避免事务中夹杂网络请求/复杂计算 | 减少锁持有时间,降低并发冲突概率 |
3. 精准索引锁 | WHERE 必须走索引(主键/唯一索引最佳) UPDATE users SET score=100 WHERE id IN (1,2,3) |
避免无索引导致全表锁,升级为表锁 |
4. 隔离级别降级 | 设置 SET GLOBAL transaction_isolation='RE |