1. READ COMMITTED 下不可重复读的发生,每条语句看到最新已提交?
在 READ COMMITTED 隔离级别下,为什么会出现不可重复读?为什么每条语句都看到最新已提交的数据会导致同一事务内两次读取结果不一致?
- READ COMMITTED 的读一致性语义
- Read View 的生成时机
- MVCC 快照的生命周期
READ COMMITTED 隔离级别下,每个 SELECT 语句在执行时都会新建一个 Read View(快照),而不是整个事务只生成一个快照。因此,事务 A 中第一条 SELECT 看到的是该语句开始时已提交的数据;如果另一个事务 B 在两条 SELECT 之间提交了对同一行数据的修改,事务 A 的第二条 SELECT 会基于新的 Read View 看到 B 提交的新数据。由于两次语句生成的快照不同,读到的数据也就不一致,这就产生了不可重复读(Non-Repeatable Read)。
不可重复读的本质是同一事务内两次读取同一行数据,但行内容发生了变化。RC 选择"每次语句刷新快照"的取舍,是为了让每次读都能尽快看到最新提交的数据,牺牲了事务内的一致性,换取了更低的隔离代价和更高的并发度。理解这一点是区分 RC 与 REPEATABLE READ 的关键。