有没有解决幻读
三种问题
- 脏读(读取到了未提交的事务,用MVCC中的快照读解决(RC))
- 不可重复读(两次读取的同一条数据不一样,用RR解决)
- 幻读(读到了新增的数据,MVCC+间隙锁能解决大部分幻读问题)
可以解决的幻读
MVCC的快照读情况下不会发生幻读
利用加锁(间隙锁)可以防止其他事务新增
无法解决的幻读
先快照读然后当前读
所以RR可以解决部分幻读问题
为什么RR是MySQL的默认隔离级别
结论:为了兼容binlog中的statement格式
为什么
在早期binlog格式为statement(记录事务修改的原SQL语句),在RC隔离级别下会发生以下问题

主库中会存在一条数据, 由于B先提交从库中没有数据,发生了数据不一致
RR级别下:增删改语句会加临键锁,insert会等事务提交后才执行,所以是A先提交, B再提交, 主从数据一致,所以RC和statement格式不能一起使用