结论
在标准SQL规范定义的四个事务隔离级别中,可重复读(Repeatable Read)是可能出现幻读(phantom reads)的。
但是MySQL/innodb 可重复读(Repeatable Read)不存在幻读,换句话说,对于MySQL的其他存储引擎或其他数据库的RR,
是有可能存在幻读的,具体情况没有探究。
幻读
所谓幻读,就是同一个事务,连续做两次当前读(例如:select * from t1 where id = 10 for update;),那么这两次当前读返回的是完全相同的记录(记录数量一致,记录本身也一致),第二次的当前读,不会比第一次返回更多的记录。
快照读和当前读
innodb的读分为两种:快照读 (snapshot read)和当前读 (current read)
1)快照读通过innodb的多版本并发控制(Multi-Version Concurrency Control)也就是MVCC来避免幻读, 不同存储引擎或数据库实现的MVCC各不相同,因此除innodb外的MVCC对于快照读是有可能出现幻读的。
2)当前读通过next-key locking来避免幻读
总结
innodb无论是快照读还是当前读,都不存在幻读