news 2026/5/30 17:56:42

【MySQL】 事务隔离级别、脏读不可重复读幻读、MVCC 超全详解【面试必背】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【MySQL】 事务隔离级别、脏读不可重复读幻读、MVCC 超全详解【面试必背】

大家好,我是程序员二叉。

简介

本文系统讲解 MySQL 四大事务隔离级别、脏读/不可重复读/幻读核心区别、各级别解决的问题、InnoDB 默认隔离级别、幻读成因与解决方案、MVCC 底层原理,以及可重复读是否彻底解决幻读等面试高频难点。全文通俗易懂、图文总结、适合收藏刷题、面试突击、基础复盘,欢迎点赞收藏加关注。

一、MySQL 四大事务隔离级别(由低到高)

MySQL 标准 SQL 定义了4 种事务隔离级别,隔离级别越高、一致性越强、并发性能越差。

  1. READ UNCOMMITTED(读未提交)
  2. READ COMMITTED(读已提交)
  3. REPEATABLE READ(可重复读)
  4. 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. 幻读三种解决方案

  1. RR级别 + 间隙锁 Gap Lock / 临键锁
    锁住查询范围,禁止其他事务插入数据(InnoDB 核心方案)
  2. 当前读加锁
    select ... for update锁住范围,防止插入
  3. 串行化隔离级别
    事务排队执行,彻底杜绝幻读

六、MVCC 多版本并发控制(核心原理)

1. 什么是 MVCC

MVCC(Multi-Version Concurrency Control)多版本并发控制

InnoDB 用来实现RC、RR 隔离级别的底层机制,实现读写不阻塞

2. 核心作用

  • 读不加锁、写加锁
  • 读写并发互不阻塞,大幅提升并发性能
  • 通过数据历史版本实现隔离

3. MVCC 三大核心组件

  1. undo log
    保存数据修改前的历史版本,用于回滚 & 快照读。
  2. read view(读视图)
    事务开启瞬间生成的视图,用来判断数据版本是否可见
  3. 数据隐藏字段
    每行数据包含:事务ID、回滚指针,串联历史版本链。

4. 工作流程

  • 开启事务 → 生成 read view
  • 查询数据 → 对比版本链
  • 找到当前事务可见的历史版本数据返回
  • 全程无锁读取

七、高频面试难点:可重复读(RR)完全解决幻读了吗?

标准答案(面试满分回答)

没有完全解决。

详细区分

  1. 快照读(普通 select)✅ 解决幻读
    事务全程读取同一个快照数据,新增数据不可见,无幻读。

  2. 当前读(update / delete / select for update)❌ 仍存在幻读
    当前读读取最新数据,
    若没有命中索引、没有触发间隙锁,依然会出现幻读问题

最终结论

  • MVCC 解决了快照读幻读
  • 间隙锁解决了当前读幻读
  • RR 级别并非百分百彻底解决幻读(极端场景仍存在)

八、面试终极总结(背诵版)

  1. MySQL 四大隔离级别:读未提交、读已提交、可重复读、串行化。
  2. 脏读:读未提交数据;不可重复读:单行前后不一致;幻读:行数前后不一致。
  3. InnoDB 默认隔离级别:可重复读 RR
  4. RC 解决脏读;RR 解决脏读、不可重复读;串行化解决全部问题。
  5. MVCC 是多版本并发控制,依靠 undo log + read view 实现无锁快照读。
  6. RR没有彻底解决幻读,仅快照读无幻读,当前读仍可能存在幻读。
  7. 幻读彻底解决方案:间隙锁 / 临键锁、加锁读、串行化
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/31 15:27:30

别再只会用数组了!Halcon向量与字典的5个实战场景,效率翻倍

别再只会用数组了!Halcon向量与字典的5个实战场景,效率翻倍在工业视觉开发中,数据结构的选择往往决定了代码的扩展性和执行效率。许多Halcon开发者习惯性地使用数组(Tuple)处理所有数据,却忽略了向量&#…

作者头像 李华
网站建设 2026/5/31 13:27:08

AzurLaneAutoScript:5步快速上手碧蓝航线全自动挂机助手终极指南

AzurLaneAutoScript:5步快速上手碧蓝航线全自动挂机助手终极指南 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研,全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript …

作者头像 李华
网站建设 2026/5/30 21:51:08

游戏设计先行:新手免费工具包与核心玩法验证方法论

1. 项目概述:为什么“设计先行”对新手至关重要“Game Design First: A Beginner’s Free Toolkit”这个标题,精准地戳中了许多游戏开发爱好者的痛点。太多人一上来就扎进引擎里,对着复杂的界面和代码发愁,结果往往是热情耗尽&…

作者头像 李华