MySQL 事务隔离级别面试精讲:脏读、幻读、不可重复读到底怎么区分?

事务隔离级别几乎是 MySQL 面试必问题。

三种并发问题

脏读:读了别人还没提交的数据。别人回滚了,你读到的就是脏数据。

场景:A 转账给 B 100 元,但还没提交。B 查余额发现多了 100。A 回滚了。B 白高兴了。

不可重复读:同一个事务内,两次读同一行数据,结果不一样(别人 Update 了)。

场景:事务 A 读了余额是 500。事务 B 改了余额为 600 并提交。事务 A 再读,变成 600。

幻读:同一个事务内,两次查询,第二次多了一些行(别人 Insert 了)。

场景:事务 A 查了所有余额大于 500 的用户,有 3 个。事务 B 插入了新用户余额 800。事务 A 再查,变成 4 个。

四种隔离级别

级别 脏读 不可重复读 幻读
Read Uncommitted
Read Committed
Repeatable Read(默认) 部分解决
Serializable

InnoDB 如何实现 Repeatable Read

  • MVCC(多版本并发控制):每个事务看到的是一个「快照」,而不是实时数据
  • Next-Key Lock:行锁 + 间隙锁,解决幻读问题

面试话术

MySQL 默认是 Repeatable Read。它用 MVCC 实现快照读,保证同一个事务内读到的数据是一致的。对于写操作,用 Next-Key Lock 防止幻读——不仅锁住查询到的行,还锁住行之间的间隙。

别只背表格。能说出 MVCC 和 Next-Key Lock 这两个关键词,面试官就知道你真的懂了。

关于 Zihao Zhang

后端开发工程师。关注 Java/Spring Boot/Redis/MySQL 技术栈,分布式系统,OLAP 数据库,AI Agent 开发与应用。

评论

评论已关闭。