跳转至

可重复读下存在幻读吗

一、结论

InnoDB 的 RR 级别,快照读不会幻读,当前读会幻读。

二、为什么

快照读

普通 select,走 MVCC,用同一个 ReadView,不会看到新插入的行。

当前读

select for update,读最新,会看到新插入的行。

三、怎么完全解决幻读

Next-Key Lock(行锁 + 间隙锁):

select * from t where id > 10 for update;

锁住间隙,其他事务不能插入。

四、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 解决。