不可重复读是指同一个事务两次读取的结果不一样,幻读也是指同一个事务两次读取的结果不一样,它们的区别在于,不可重复读是由于读取的数据发生了修改,幻读则是由于读取的数据集发生了新增或者删除。

所以,解决不可重复读只需要记录锁 或者 快照读 或者 共享锁,解决幻读则需要加间隙锁,记录锁锁定了一条记录,而间隙锁则锁定了一个记录区间。

举个例子,select ... where id > 3 and id < 6,间隙锁可以锁住id位于3和6之间的区间,但无法锁住 3 之前和 6 之后。

所以,MySQL 在可重复读隔离级别下可以避免幻读,但无法完全解决幻读。

重点:快照读 + 间隙锁