可重复读下存在幻读吗¶
一、结论¶
InnoDB 的 RR 级别,快照读不会幻读,当前读会幻读。
二、为什么¶
快照读¶
普通 select,走 MVCC,用同一个 ReadView,不会看到新插入的行。
当前读¶
select for update,读最新,会看到新插入的行。
三、怎么完全解决幻读¶
Next-Key Lock(行锁 + 间隙锁):
锁住间隙,其他事务不能插入。
四、InnoDB 的幻读解决¶
- 快照读:MVCC。
- 当前读:Next-Key Lock。
但要注意: - 事务内先快照读再当前读,当前读会看到新数据。
五、例子¶
-- 事务 A
select * from t where id > 10; -- 快照读,10行
-- 事务 B
insert into t ...;
-- 事务 A
select * from t where id > 10; -- 还是10行
select * from t where id > 10 for update; -- 11行,幻读
一句话
快照读不幻读,当前读会幻读,Next-Key Lock 解决。