第 08 篇 隔离级别与 MVCC:一致性视图究竟在什么时刻生成
开篇钩子
同一个事务里执行两次相同的SELECT,中间别人改了数据并提交了。你看到的是旧值——整个事务内数据都没变。这个"看到旧值"的能力,既不是锁,也不是任何黑魔法,而是 undo log 加上一个叫ReadView的快照。
搞清楚 ReadView 在什么时刻生成、怎么判断哪个版本可见,就搞清楚了 REPEATABLE READ 和 READ COMMITTED 的全部区别。这篇从头推导,不背结论。
1. 四种隔离级别与三类并发问题
SQL 标准定义了四种隔离级别,用来解决三类并发问题:
| 并发问题 | 含义 | 举例 |
|---|---|---|
| 脏读 | 读到了另一个未提交事务的修改 | A 把余额改成 0 但还没提交,B 就读到了 0 |
| 不可重复读 | 同一事务两次读同一行,值不一样 | A 两次读 status,中间 B 提交了修改 |
| 幻读 | 同一事务两次读同一范围,行数不一样 | A 两次查 amount>1000 的订单,中 |
