mysql InnoDB 引擎默认可重复读。
普通的select 使用的快照读,当前读针对的delete,insert,update.
针对快照读,是通过 MVCC 方式解决了幻读.
针对当前读,是通过next-key lock(记录锁+间隙锁)方式解决了幻读。
上面是一般场景解决幻读问题,特殊情况下,幻读还存在。
- 事务 A 先开始快照读 -》事务B插入一条语句后提交 -》事务A更新了刚才事务 B 插入的记录。 在查询时就能查到事务B插入的数据。产生幻读。
- 事务 A 先开始快照读 -》事务B插入一条语句后提交 -》事务A使用当前读select * from X for update。 就能查到事务B插入的数据。产生幻读。
所以,mysql可重复读模式解决幻读是通过mvcc,和间隙锁,但是事务过程中如果使用当前读或者更新其他线程插入的数据,那么当前事务会拿到其他事务线程提交的数据,产生幻读。当前读必须在其他线程插入数据前执行了才可以锁住。