MVCC 和 WAL 不是一层的东西
两个缩写经常一起出现,但解决的是 ACID 里不同的字母:
| MVCC | WAL | |
|---|---|---|
| 全称 | 多版本并发控制 | 预写日志 |
| 做法 | 改数据时留下旧版本,读事务读自己能看见的那一版 | 先把改动顺序追加到日志并刷盘,数据页稍后再写 |
| 解决 | I(隔离):读写不互相阻塞 | D(持久):崩溃后重放日志;顺带把随机写变成顺序写 |
| InnoDB 里 | undo 版本链 + Read View | redo log |
一个管并发时谁能看见什么,一个管崩溃后怎么恢复。
概念各家都有,实现不一样:PostgreSQL 没有 undo 版本链,新旧版本都留在表里,靠 VACUUM 清理;它的快照(xmin / xmax / xip)和 InnoDB 的 Read View 几乎能一一对上。