分享数据库事务的四个隔离级别(读未提交、读已提交、可重复读、串行化)的实现本质是通过锁机制(读锁、写锁、间隙锁)和 MVCC(多版本并发控制)的协同控制,具体对比如下:

一、读未提交(Read Uncommitted)
- 实现本质:无锁机制 + 无 MVCC
事务直接读取内存中的最新数据,不加任何锁,也不生成版本快照。
问题:可能读取到其他事务未提交的脏数据(脏读)。
二、读已提交(Read Committed)
- 实现本质:行级写锁 + MVCC 快照读
- 写操作:对修改的数据加排他锁(X 锁),防止其他事务同时修改。
- 读操作:每次查询生成新的 ReadView(快照),通过 MVCC 读取已提交的数据版本。
特点:避免脏读,但同一事务内多次读取可能因数据更新产生不可重复读。
三、可重复读(Repeatable Read)
- 实现本质:行级锁 + 间隙锁 + MVCC 快照读
- 写操作:加排他锁(X 锁),锁定当前行。
- 读操作:基于事务初始生成的 ReadView 快照,通过 MVCC 避免脏读和不可重复读。
- 间隙锁(Gap Lock):锁定索引范围(如 (id=5, id=10)),防止其他事务插入新数据导致幻读。
特点:MySQL 默认隔离级别,解决脏读、不可重复读,但需结合间隙锁才能完全避免幻读。
四、串行化(Serializable)
- 实现本质:表级锁 + 强制串行执行
- 读操作:对查询范围加共享锁(S 锁),阻止其他事务写入。
- 写操作:对数据加排他锁(X 锁),并阻塞其他所有操作。
特点:完全避免并发问题,但性能极低,仅用于强一致性要求的场景。
锁与 MVCC 的协同关系
隔离级别 | 锁机制 | MVCC 作用 | 并发性能 |
---|
读未提交 | 无锁 | 无 | 最高 |
读已提交 | 行级写锁 + MVCC 快照 | 避免脏读 | 较高 |
可重复读 | 行级锁 + 间隙锁 + MVCC | 避免脏读、不可重复读、幻读 | 中等 |
串行化 | 表级锁 | 强制串行执行 | 最低 |
关键总结
- 读未提交:无锁,性能最高但数据一致性最差。
- 读已提交:通过 MVCC 快照实现非锁定读,避免脏读。
- 可重复读:结合行锁、间隙锁和 MVCC,解决大部分并发问题。
- 串行化:完全串行化执行,牺牲性能换取最高一致性。
实际应用中,可重复读(RR) 是 MySQL 默认选择,通过 MVCC 和间隙锁的协同,在保证数据一致性的同时兼顾性能