1. REPEATABLE READ 下幻读的防止,Next-Key Lock 或快照读?
在 REPEATABLE READ 隔离级别下,幻读是如何被防止的?是靠 Next-Key Lock 还是快照读?
- 快照读与当前读下幻读的差异
- Next-Key Lock 的作用
- RR 下幻读的防止机制
在 REPEATABLE READ 下,幻读的防止是"快照读 + 临键锁"共同作用的结果。对于快照读(普通 SELECT),通过事务级 Read View 的复用,同一事务内两次查询返回一致的行集合,因此看不到"幻行"。对于当前读(SELECT ... FOR UPDATE、UPDATE、DELETE),InnoDB 使用 Next-Key Lock(临键锁,即记录锁 + 间隙锁的组合)锁定搜索范围内的记录及其间隙,阻止其他事务在范围内插入新行,从而防止幻读。所以快照读靠 MVCC 版本隔离,当前读靠临键锁。
关键要区分"快照读防幻读"与"当前读防幻读"是两种不同的机制。快照读靠 Read View 复用,当前读靠锁。这也是为什么 RR 下普通 SELECT 不会看到幻行,而若不加锁则可能在某些场景下(如当前读)暴露幻读问题。