外观
一句话答案
间隙锁锁住索引记录之间的间隙防止插入,配合记录锁组成临键锁(Next-Key Lock),在 RR 级别解决幻读。
核心要点
幻读: 同一事务两次查询返回不同的行数(新插入的行)
RR级别解决幻读: 快照读靠MVCC / 当前读靠间隙锁+临键锁
临键锁(Next-Key Lock): 记录锁 + 间隙锁 = 左开右闭区间
追问与易错
追问方向:
- 间隙锁只在 RR 级别有吗?(是的,RC 没有间隙锁)
- 间隙锁会导致死锁吗?举例?(两个事务互相锁住对方要插入的间隙)
- 如何避免间隙锁导致的性能问题?(精确等值查询/降低隔离级别到 RC)
易错点:
- ❌ "间隙锁锁的是行"——间隙锁锁的是索引记录之间的「间隙」,不锁已有记录
- ❌ "RC 级别不会有锁冲突"——RC 仍有记录锁,只是没有间隙锁
💡 记忆锚点
幻读是"明明查过没人,回头一看多出几条"的灵异事件。间隙锁就是在两条记录之间拉起警戒线,不让新数据插队进来。临键锁 = 记录锁 + 间隙锁,锁住一个点和它左边的空档(前开后闭区间),RR 级别下当前读靠它防幻读,快照读靠 MVCC 防幻读。