Skip to content
极高进阶

一句话答案

四级隔离:读未提交(脏读)→读已提交(不可重复读)→可重复读(RR,MySQL 默认,MVCC+间隙锁解决幻读)→串行化。

核心要点

三大并发问题:

  • 脏读(Dirty Read):读到了另一个事务未提交的数据,如果那个事务回滚,读到的就是"脏数据"
  • 不可重复读(Non-repeatable Read):同一事务内,多次读同一行数据,结果不同(另一事务修改并提交了)
  • 幻读(Phantom Read):同一事务内,两次按条件查询,结果集行数不同(另一事务插入或删除了行)

四种隔离级别(由低到高):

隔离级别脏读不可重复读幻读性能
READ UNCOMMITTED(读未提交)✅ 解决❌✅ 存在✅ 存在最高
READ COMMITTED(读已提交)✅ 解决✅ 存在✅ 存在
REPEATABLE READ(可重复读)✅ 解决✅ 解决⚠️ 基本解决
SERIALIZABLE(串行化)✅ 解决✅ 解决✅ 解决最低

⚠️ InnoDB 的 REPEATABLE READ 通过 MVCC + Next-Key Lock,实际上解决了大多数幻读场景,这是与标准 SQL 定义的区别。

MySQL 默认:REPEATABLE READ

追问与易错

追问方向:

  • MySQL 默认隔离级别是什么?为什么选 RR?(RR,因为 binlog 基于 STATEMENT 时 RC 可能主从不一致)
  • RR 下还会有幻读吗?举个例子?(当前读场景,先 SELECT 再 INSERT 可能幻读)
  • 如何在代码中设置隔离级别?(@Transactional(isolation = ...))

易错点:

  • ❌ "RR 完全解决了幻读"——当前读场景需要手动加锁
  • ❌ 混淆脏读/不可重复读/幻读的区别

💡 记忆锚点

隔离级别像考场纪律:读未提交是开卷考(能看别人还没交的卷子,脏读),读已提交是只看已交的卷子(但每次看可能不一样,不可重复读),可重复读是考试开始时拍张照片对着看(MVCC 快照,MySQL 默认),串行化是一个个进考场考(最安全但最慢)。