来自《高性能 MySQL》:

InnoDB 在每一行都隐式的多存储两个字段:

  • 事务更新版本
  • 事务删除版本

当事务开始时记录这两个版本,在读取的时候根据 Undo Log 和 Redo Log 来实现隔离级别的控制。序列化隔离级别下只能通过行锁来保证。

在可重复读隔离级别下:

  • 首先判断事务更新版本是否大于事务开始前的版本
  • 如果大于则根据 Undo Log 进行回退实现可重复读,这样在同一事务下不管读多少遍读取到的内容都是一样的。

可重复读隔离即便下无法避免幻读:即一开始没有读取到,随着其他插入事务的提交在同一事务里执行查询又能读取到的情况。