大家好,我是程序员二叉。
简介
本文系统讲解 MySQL 四大事务隔离级别、脏读/不可重复读/幻读核心区别、各级别解决的问题、InnoDB 默认隔离级别、幻读成因与解决方案、MVCC 底层原理,以及可重复读是否彻底解决幻读等面试高频难点。全文通俗易懂、图文总结、适合收藏刷题、面试突击、基础复盘,欢迎点赞收藏加关注。
一、MySQL 四大事务隔离级别(由低到高)
MySQL 标准 SQL 定义了4 种事务隔离级别,隔离级别越高、一致性越强、并发性能越差。
- READ UNCOMMITTED(读未提交)
- READ COMMITTED(读已提交)
- REPEATABLE READ(可重复读)
- SERIALIZABLE(串行化)
✅InnoDB 默认隔离级别:可重复读(REPEATABLE READ)
二、三大读问题:脏读、不可重复读、幻读详解
1. 脏读(Dirty Read)
定义:一个事务读取到了另一个事务未提交的数据。
如果对方事务回滚,当前读到的数据就是虚假、无效脏数据。
场景
- 事务B修改数据未提交
- 事务A直接读到未提交数据
- B回滚 → A读到脏数据
2. 不可重复读(Non-Repeatable Read)
定义:同一个事务内,多次读取同一行数据,结果不一致。
核心:单行数据被其他事务修改并提交。
场景
- 事务A开启,第一次查询某行数据
- 事务B修改该行并提交
- 事务A再次查询,数据改变 → 不可重复读
3. 幻读(Phantom Read)
定义:同一个事务内,相同查询条件,前后查询行数不一致。
核心:其他事务新增/删除数据,不是修改旧数据。
场景
- 事务A查询
age=18得到 3 条 - 事务B插入一条
age=18并提交 - 事务A再次查询,变成 4 条 → 出现幻觉
💡一句话区分
- 脏读:读了别人未提交
- 不可重复读:单行被改
- 幻读:行数变多/变少
三、四大隔离级别解决问题对照表(面试必背)
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 并发性能 |
|---|---|---|---|---|
| 读未提交 | ❌ 无法解决 | ❌ 无法解决 | ❌ 无法解决 | 最高 |
| 读已提交 | ✅ 解决 | ❌ 无法解决 | ❌ 无法解决 | 较高 |
| 可重复读 | ✅ 解决 | ✅ 解决 | ⭕ 部分解决 | 中等 |
| 串行化 | ✅ 解决 | ✅ 解决 | ✅ 完全解决 | 最低 |
四、各级别核心特点总结
1. 读未提交(最低)
几乎不用,完全无隔离,问题全部存在。
2. 读已提交(RC)
- 解决:脏读
- 存在:不可重复读、幻读
- 特点:每次读都是最新快照
3. 可重复读(RR,InnoDB 默认)
- 解决:脏读、不可重复读
- 存在:当前读下仍有幻读
- 特点:事务启动后,数据快照固定,保证重复读一致
4. 串行化(最高)
事务串行执行,完全隔离,无任何并发问题,性能最差。
五、彻底搞懂:什么是幻读?如何解决?
1. 幻读本质
范围查询下,其他事务插入/删除数据,导致当前事务查询行数前后不一致。
2. 幻读三种解决方案
- RR级别 + 间隙锁 Gap Lock / 临键锁
锁住查询范围,禁止其他事务插入数据(InnoDB 核心方案) - 当前读加锁
select ... for update锁住范围,防止插入 - 串行化隔离级别
事务排队执行,彻底杜绝幻读
六、MVCC 多版本并发控制(核心原理)
1. 什么是 MVCC
MVCC(Multi-Version Concurrency Control)多版本并发控制
InnoDB 用来实现RC、RR 隔离级别的底层机制,实现读写不阻塞。
2. 核心作用
- 读不加锁、写加锁
- 读写并发互不阻塞,大幅提升并发性能
- 通过数据历史版本实现隔离
3. MVCC 三大核心组件
- undo log
保存数据修改前的历史版本,用于回滚 & 快照读。 - read view(读视图)
事务开启瞬间生成的视图,用来判断数据版本是否可见。 - 数据隐藏字段
每行数据包含:事务ID、回滚指针,串联历史版本链。
4. 工作流程
- 开启事务 → 生成 read view
- 查询数据 → 对比版本链
- 找到当前事务可见的历史版本数据返回
- 全程无锁读取
七、高频面试难点:可重复读(RR)完全解决幻读了吗?
标准答案(面试满分回答)
没有完全解决。
详细区分
快照读(普通 select)✅ 解决幻读
事务全程读取同一个快照数据,新增数据不可见,无幻读。当前读(update / delete / select for update)❌ 仍存在幻读
当前读读取最新数据,
若没有命中索引、没有触发间隙锁,依然会出现幻读问题。
最终结论
- MVCC 解决了快照读幻读
- 间隙锁解决了当前读幻读
- RR 级别并非百分百彻底解决幻读(极端场景仍存在)
八、面试终极总结(背诵版)
- MySQL 四大隔离级别:读未提交、读已提交、可重复读、串行化。
- 脏读:读未提交数据;不可重复读:单行前后不一致;幻读:行数前后不一致。
- InnoDB 默认隔离级别:可重复读 RR。
- RC 解决脏读;RR 解决脏读、不可重复读;串行化解决全部问题。
- MVCC 是多版本并发控制,依靠 undo log + read view 实现无锁快照读。
- RR没有彻底解决幻读,仅快照读无幻读,当前读仍可能存在幻读。
- 幻读彻底解决方案:间隙锁 / 临键锁、加锁读、串行化。