本篇博客基于MySQL 5.7版本.
事务的介绍看这篇博客: MySQL架构基础
并发控制的介绍看这篇博客: MySQL多版本并发控制与锁机制
本篇博客介绍InnoDB的四种事务隔离级别是如何实现的, 需要事先阅读上面的两篇博客.
REPEATABLE READ
MySQL多版本并发控制与锁机制 这篇博客最后一部分对REPEATABLE READ隔离级别是如何实现做了详细介绍, 这里做个简单的归纳.
普通的SELECT
快照读(MVCC), 即不加锁的一致性读. 在同一个事务中, 只有第一次查询会生成读视图(Read View), 这就解决了不可重复读的问题.
加锁SELECT/UPDATE/DELETE
(1)在唯一索引(PRIMARY KEY和UNIQUE KEY) 上使用唯一的查询条件时, 加记录锁.
(2)其他情况使用间隙锁或者临键锁(InnoDB使用的是临键锁, 因为间隙锁可以被显示禁用). 间隙锁和临键锁解决了幻读的问题.
INSERT
在插入索引间隔内加插入意向锁, 对具体的插入行加记录锁.
READ COMMITTED
普通的SELECT</