当前位置: 首页 > news >正文

【MySQL】MVCC底层原理超全详解(快照读/当前读/版本链/ReadView/隔离级别)

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

一、简介

MVCC(多版本并发控制)是 MySQL InnoDB 引擎的核心机制,也是后端面试高频考点。它可以无锁实现读写并发,解决读写互相阻塞的性能问题,同时支撑了 MySQL 两大事务隔离级别:读已提交(RC)、可重复读(RR)。

本文全面拆解 MVCC 底层原理,包含快照读与当前读、行隐式字段、undo log 与版本链、ReadView 视图、隔离级别实现等内容,适合学习与面试背诵,欢迎点赞收藏关注。

二、MVCC 核心概述

MVCC 全称Multi-Version Concurrency Control(多版本并发控制),仅针对 InnoDB 存储引擎生效。

核心作用

  1. 实现无锁读,读写互不阻塞,大幅提升数据库并发能力;
  2. 依靠数据多版本机制,规避脏读、不可重复读,实现不同事务隔离级别。

MVCC 三大核心要素:行隐式字段 + undo log 版本链 + ReadView 读视图。

三、两种读取模式:快照读 & 当前读

InnoDB 的读操作分为两类,是理解 MVCC 的基础,二者核心区别:读取历史快照数据 / 读取最新实时数据

1. 快照读(Snapshot Read)

定义:无锁读取,读取事务快照中的历史版本数据,读写互不阻塞,并发性能高。
触发语句:普通无锁SELECT查询。

-- 典型快照读SELECT*FROMuserWHEREid=1;

举例(可重复读级别)

  1. 事务 A 开启事务,首次查询 id=1,结果为 name=张三;
  2. 事务 B 修改数据为 name=李四,并提交事务;
  3. 事务 A 再次执行相同查询,依旧读到 name=张三。

原理:事务 A 读取的是事务启动时的快照数据,并非数据库最新数据。

2. 当前读(Current Read)

定义:加锁读取,强制读取数据库最新已提交数据,属于悲观锁机制,会产生锁阻塞。
触发语句:所有增删改操作、加锁查询均为当前读。

-- 加锁查询(当前读)SELECT*FROMuserWHEREid=1FORUPDATE;SELECT*FROMuserWHEREid=1LOCKINSHAREMODE;-- 写入操作(底层都是当前读)UPDATEuserSETname='李四'WHEREid=1;DELETEFROMuserWHEREid=1;

举例
事务 A 执行 FOR UPDATE 加锁查询,无论其他事务是否修改提交数据,始终读取最新数据。

四、InnoDB 行三大隐式字段

InnoDB 会为每一行数据自动添加 3 个隐藏字段,是 MVCC 实现的底层数据支撑。

隐式字段名占用字节核心作用
DB_TRX_ID6记录最后修改当前行的事务 ID(增 / 改 / 删都会更新),标记数据版本归属,是可见性判断依据
DB_ROLL_PTR7回滚指针,指向 undo log 中上一个历史版本,串联所有版本形成版本链
DB_ROW_ID8隐藏自增主键,仅表无主键 / 唯一索引时生效,**和 MVCC **无关,仅用于物理存储

五、Undo Log 日志 & 数据版本链

1. Undo Log 核心作用

Undo Log 即回滚日志,是 InnoDB 核心日志之一,主要有两大作用:

  1. 事务回滚:事务失败或执行 ROLLBACK 时,依靠 undo log 恢复数据,保证事务原子性;
  2. 支撑 MVCC:存储数据历史版本,为快照读提供旧数据,实现无锁读取。

2. 版本链

定义:同一条数据的所有历史版本,通过 DB_ROLL_PTR 回滚指针串联形成的单向链表,称之为版本链。

版本链规则
链表头节点:数据最新版本(磁盘物理数据);
链表后续节点:undo log 中存储的历史旧版本;
每次修改数据,都会生成新版本并挂载到链表头部。

版本链生成示例
事务 10 插入数据 id=1,name=张三 → 版本 1(TRX_ID=10);
事务 20 修改为 李四 → 版本 2(TRX_ID=20),指针指向版本 1;
事务 30 修改为 王五 → 版本 3(TRX_ID=30),指针指向版本 2。
最终版本链:版本 3(最新) → 版本 2 → 版本 1(最旧)

六、ReadView 读视图(可见性判断核心)

ReadView 是快照读时生成的一致性视图,核心作用:**遍历版本链,判断当前事务能看到哪个历史版本,**是实现事务隔离级别的关键。

1. ReadView 四大核心字段

字段名详细作用
m_ids生成 ReadView 瞬间,数据库中所有活跃、未提交的事务 ID 集合
min_trx_idm_ids 集合中最小的事务 ID
max_trx_id系统下一个待分配的事务 ID(全局自增)
creator_trx_id当前事务自身 ID(创建该 ReadView 的事务)

2. 数据可见性规则(按顺序判断)

取出数据版本的 DB_TRX_ID,依次执行以下规则:
1、若 TRX_ID == creator_trx_id:当前数据由自己修改,可见
2、若 TRX_ID < min_trx_id:修改事务早已提交,可见
3、若 TRX_ID >= max_trx_id:属于未来未开启的事务,不可见
4、若 TRX_ID 在 m_ids 中:事务活跃未提交,不可见;不在集合中则代表已提交,可见

兜底逻辑:当前版本不可见时,顺着版本链向前遍历旧版本,直到找到可见版本,无匹配则返回空。

七、MVCC 实现 RC、RR 隔离级别

两大隔离级别底层实现核心区别:ReadView 的生成时机不同

1. 读已提交(RC)

生成规则:每执行一次快照读,都会重新生成全新的 ReadView;

效果:每次查询都能感知数据库最新事务状态,可以读到其他事务刚提交的数据;

特点:解决脏读,**会出现不可重复读,**数据实时性强。

2. 可重复读(RR,MySQL 默认级别)

生成规则:事务中第一次执行快照读时生成 ReadView,后续所有查询复用该视图;

效果:整个事务周期内,查询结果和首次查询保持一致;

特点:解决脏读、不可重复读,配合间隙锁可解决大部分幻读问题,是 MySQL 默认隔离级别。

八、全文核心总结(面试必背)

  1. MVCC 本质:依靠行隐式字段 + undo log 版本链 + ReadView,实现无锁多版本并发控制,兼顾性能与隔离性;
  2. 两种读模式:普通 SELECT 是快照读(无锁、读历史版本);增删改、加锁查询是当前读(加锁、读最新数据);
  3. 三大隐式字段:DB_TRX_ID(修改事务 ID)、DB_ROLL_PTR(版本链指针)、DB_ROW_ID(隐藏主键,与 MVCC 无关);
  4. 版本链:由回滚指针串联 undo log 中的历史数据版本;
  5. 隔离级别核心:RC 每次查询新建 ReadView;RR 仅首次查询创建 ReadView 并全程复用。
http://www.gsyq.cn/news/1423753.html

相关文章:

  • 制造业供应商管理,绩效评估全靠人工印象?2026供应链数字员工实战指南:基于实在Agent的客观量化方案
  • 综合算法 V | 面试技巧与问题分析
  • 2026年西安高三补习学校哪家值得去?师资、管理与效果深度解析 - 科技焦点
  • 我用龙虾两天开发了4个网站
  • Umi-CUT:快速批量去除图片黑边的终极解决方案
  • 2026沈阳精密抛光服务公司评估:真空设备、金属、不锈钢、不锈钢板、不锈钢管、铜、铝、屏蔽罩、铝屏蔽罩、防尘罩及医药设备抛光 - 品牌企业推荐师(官方)
  • 别再只盯着PageRank了!用NetworkX实战计算社交网络中的‘关键人物’(介数中心度详解)
  • 创业团队如何利用多模型聚合平台优化AI产品开发成本
  • 别再只盯着串联机械臂了!聊聊5自由度并联机械臂在轻量搬运场景下的独特优势
  • 视频号视频怎么无水印下载?2026微信视频号保存方法全解析 - 科技大爆炸
  • 2026实力之选:重庆/云南/贵州交通设施供应商综合评估 - 品牌企业推荐师(官方)
  • IEEE Transactions on Computational Social Systems 投稿全流程复盘:从Latex打包到最终提交的避坑指南
  • 四川盛世钢联|成都钢材现货报价查询|四川经销商省心采购指南 - 四川盛世钢联营销中心
  • 2026年西安高考补习学校哪家更合适?五家热门学校选型指南 - 科技焦点
  • EG2103:600V半桥驱动,0.6A灌流,逻辑简化设计
  • 快速更改Rocky10静态IP:nmcli 命令详解
  • 西安高三补习学校推荐:2026年本科上线率、师资与小班教学哪家好? - 科技焦点
  • 从电影推荐到商品排序:nDCG指标在真实业务中的Python实现与调参心得
  • 2026最新:琼海CMA甲醛检测公司优选海南宏启环境,本地标杆、数据权威、口碑领跑 - 专注室内空气检测治理
  • 视频号视频怎么保存到手机相册?2026免费无水印保存攻略 - 科技大爆炸
  • Lindy报告自动化架构深度拆解(含真实金融客户POC数据:生成时效提升237%,错误率趋近于0)
  • 西安高三补习学校靠谱推荐:2026年师资力量、升学率哪家好? - 科技焦点
  • 京顺斋上门回收,不止是变现,更是对传统文化的守护 - 深鉴新闻
  • Figma界面汉化终极指南:3分钟实现全中文设计体验
  • AI战略落地卡点全解析,Claude规划文档中被92%团队忽略的4个合规性断层
  • 轻小件成本体系被改写之后跨境卖家如何重构引流品角色
  • 买前必看 | 浅聊FreeClip2音质体验
  • 如何让普通鼠标在Mac上实现触控板级体验?Mac Mouse Fix终极配置指南
  • DIY露营车低电压监测站:集成电压监测、USB充电与风扇控制的3D打印面板制作
  • 告别捆绑软件!Win11/Win10官方纯净安装U盘制作与使用全指南