一、数据库标准四大隔离级别
SQL 标准定义 4 个隔离级别,从低到高:
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed,RC)
- 可重复读(Repeatable Read,RR)
- 串行化(Serializable)
二、完整对照表(两大库全部级别都列全)
| 隔离级别 | 简称 | 脏读 | 不可重复读 | 幻读 | PostgreSQL 支持 | MySQL InnoDB 支持 |
|---|---|---|---|---|---|---|
| 读未提交 | RU | 允许 | 允许 | 允许 | 支持 | 支持 |
| 读已提交 | RC | 杜绝 | 允许 | 允许 | 支持 | 支持**(默认)** |
| 可重复读 | RR | 杜绝 | 杜绝 | PG杜绝 / MySQL存在 | 支持**(默认)** | 支持 |
| 串行化 | SRL | 杜绝 | 杜绝 | 杜绝 | 支持 | 支持 |
三、MVCC核心对比表
| 对比维度 | PostgreSQL | MySQL InnoDB |
|---|---|---|
| 默认事务隔离级别 | 可重复读(Repeatable Read) | 读已提交(Read Committed) |
| MVCC 实现机制 | 基于事务启动快照 | 基于 Undo Log 版本链 |
| 快照生效时机 | 事务开启瞬间固定全局快照 | 每次执行SELECT都会重新生成快照 |
| 脏读 | 完全杜绝 | 完全杜绝 |
| 不可重复读 | 完全杜绝 | RC 级别会出现;RR 级别杜绝 |
| 幻读问题 | RR 级别天然杜绝幻读 | RR 级别无法彻底杜绝幻读,依赖间隙锁补偿 |
| 读写并发特性 | 读写互不阻塞,快照读无锁竞争 | 写阻塞读、读阻塞写,锁机制更偏重 |
| 适用场景倾向 | 复杂查询、数据分析、JSON业务、向量检索 | 高并发简单CRUD、互联网业务主库 |
四、原理深度解析
1. PostgreSQL MVCC + 可重复读原理
PostgreSQL 事务一旦开启,会立刻生成一份全局数据快照,整个事务生命周期内,所有查询都复用同一份快照版本。
事务只会读取快照内已提交的数据,其他事务后续的新增、修改、提交操作,对当前事务完全不可见。
由此天然实现:
- 同一事务多次查询,数据始终一致(解决不可重复读)
- 避免区间范围内新增数据感知(天然解决幻读)
2. MySQL InnoDB MVCC 原理
MySQL InnoDB 同样基于 MVCC,但快照粒度更细:
不是事务级快照,是每条 SELECT 单独生成快照。
在可重复读级别下,只能保证同一条语句结果一致,无法约束区间范围的新数据插入,因此无法彻底解决幻读,只能依靠 Next-Key Lock 间隙锁做业务层面弥补。
五、一句话总结
- PostgreSQL 默认可重复读,事务级固定快照,依托 MVCC 同时解决不可重复读与幻读,读写并发性能更优。
- MySQL InnoDB 默认读已提交,语句级动态快照,RR 级别只能解决不可重复读,幻读需依赖锁机制兜底。