前言
MySQL可重复读(RR)隔离级别,为了解决幻读问题引入了Next-Key Lock临键锁(记录锁+Gap间隙锁)。Gap锁带来的死锁问题隐蔽,线上偶发,很难复现。
本文基于订单SaaS项目真实故障,拆解并发范围查询加锁导致死锁的完整过程,给出落地解决方案,同时整理其他经典死锁场景。
一、核心概念
- Next-Key Lock(临键锁) = 记录锁 + Gap间隙锁;RR隔离级别默认开启。
- 二级索引、范围查询加for update,会触发临键锁。
- Gap间隙锁是共享锁,多个事务可以同时持有同一个区间的Gap锁,互不阻塞。
二、死锁完整场景
业务场景:两个事务并发执行,根据user_id范围查询订单并更新状态。
sql
select * from order where user_id=? for update;
update order set status=?