
大家好我是程序员二叉。简介本文系统讲解 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查询age18得到 3 条事务B插入一条age18并提交事务A再次查询变成 4 条 → 出现幻觉一句话区分脏读读了别人未提交不可重复读单行被改幻读行数变多/变少三、四大隔离级别解决问题对照表面试必背隔离级别脏读不可重复读幻读并发性能读未提交❌ 无法解决❌ 无法解决❌ 无法解决最高读已提交✅ 解决❌ 无法解决❌ 无法解决较高可重复读✅ 解决✅ 解决⭕ 部分解决中等串行化✅ 解决✅ 解决✅ 完全解决最低四、各级别核心特点总结1. 读未提交最低几乎不用完全无隔离问题全部存在。2. 读已提交RC解决脏读存在不可重复读、幻读特点每次读都是最新快照3. 可重复读RRInnoDB 默认解决脏读、不可重复读存在当前读下仍有幻读特点事务启动后数据快照固定保证重复读一致4. 串行化最高事务串行执行完全隔离无任何并发问题性能最差。五、彻底搞懂什么是幻读如何解决1. 幻读本质范围查询下其他事务插入/删除数据导致当前事务查询行数前后不一致。2. 幻读三种解决方案RR级别 间隙锁 Gap Lock / 临键锁锁住查询范围禁止其他事务插入数据InnoDB 核心方案当前读加锁select ... for update锁住范围防止插入串行化隔离级别事务排队执行彻底杜绝幻读六、MVCC 多版本并发控制核心原理1. 什么是 MVCCMVCCMulti-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没有彻底解决幻读仅快照读无幻读当前读仍可能存在幻读。幻读彻底解决方案间隙锁 / 临键锁、加锁读、串行化。