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

MySQL 高并发核心:MVCC 底层原理彻底讲透,一篇吃透面试 + 实战 + 性能优化

前言为什么你总搞不懂 MVCC却又处处离不开它只要做 MySQL 开发、面试、调优MVCC 绝对是绕不开的大山。有人背了三遍概念一到面试就被问懵什么是脏读、不可重复读、幻读RC 和 RR 到底差在哪ReadView 怎么判断可见性为什么长事务能把数据库拖崩MVCC 和事务到底是不是一回事更扎心的是线上并发一高SQL 一卡问题最后往往都指向 MVCC。很多教程要么太浅只说 “读写不阻塞”要么太学术满篇公式看得人头大。今天这篇我用最通俗、最落地、最吸粉的方式把 MVCC 从底层原理、隐藏字段、版本链、ReadView、隔离级别、和事务的区别、到实战使用、性能提升一次性彻底讲透。无论你是面试突击、业务开发、DBA 运维看完这篇MVCC 这块直接封神。一、先搞懂MVCC 到底是个啥解决了什么痛点MVCC全称Multi-Version Concurrency Control多版本并发控制。听着高大上其实逻辑非常朴素一份数据存多个版本。你读旧的我写新的咱俩互不干扰。在没有 MVCC 的年代数据库靠锁过日子读要加 S 锁写要加 X 锁读阻塞写写阻塞读结果就是高并发下全是锁等待接口超时死锁频发数据库直接跪。MVCC 就是来破局的。它的核心能力就三件事读不加锁读写不阻塞实现事务隔离避免脏读、不可重复读在快照读层面避免幻读大幅提升并发能力一句话总结MVCC 用空间换时间用版本换并发。什么是脏读、不可重复读面试必问一看就懂在讲 MVCC 之前必须先搞懂并发事务带来的三大问题因为 MVCC 存在的意义就是为了解决它们。1. 什么是脏读脏读一个事务读到了另一个事务 “还没提交” 的数据。场景举例事务 A 把用户余额从 100 改成 200但还没提交事务 B 查到余额是 200拿去做业务逻辑结果事务 A 异常回滚了余额变回 100事务 B 之前读到的 200 就是脏数据这种情况就叫脏读。脏读本质是读到了未提交数据业务完全不可接受。2. 什么是不可重复读不可重复读一个事务内同一条 SQL 多次执行结果不一样。场景举例事务 A 第一次查询余额100事务 B 修改余额为 200 并提交事务 A 再查一次余额200同一个事务内两次查询结果不一致这就叫不可重复读。它比脏读轻但会导致事务内部逻辑错乱尤其在统计、扣款、对账场景非常危险。3. 什么是幻读幻读一个事务内按条件查询前后结果集行数不一样像出现了 “幻觉”。场景举例事务 A 查询age18的数据共 10 条事务 B 插入一条age18并提交事务 A 再查变成 11 条多出的一行就叫幻行这种现象就是幻读。二、MVCC 底层基石每行数据都藏着三个秘密字段想真正吃透 MVCC必须先看懂 InnoDB 对每一行数据动的手脚。你看不到但它真实存在。2.1 三条隐藏字段InnoDB 聚簇索引的每一行默认带三列DB_TRX_ID6 字节最后插入 / 更新这条数据的事务 ID。全局自增用来判断版本新旧。DB_ROLL_PTR7 字节回滚指针指向 undo log 里的历史版本。无数个版本靠它串成一条链叫版本链。DB_ROW_ID6 字节隐式主键没建主键时 InnoDB 自动生成。和 MVCC 逻辑关系不大知道就行。2.2 版本链 Undo Log 是怎么形成的很多人以为更新是 “覆盖数据”大错特错。InnoDB 更新流程真实样子对旧数据加行锁把旧数据写入 undo log生成一条新数据DB_TRX_ID 设为当前事务 ID新数据的 DB_ROLL_PTR 指向 undo log 里的旧数据索引叶子节点指向最新记录最终形成新记录 → 旧记录 → 更旧记录 → ……这就是版本链。查询时就从最新版本开始顺着链往前找直到找到 “对当前事务可见” 的那一条。三、重点澄清MVCC 和事务到底有什么区别与联系这是面试最爱挖坑、90% 人混淆的地方MVCC 是事务吗事务靠 MVCC 实现吗今天一次性说清楚。3.1 本质区别层级完全不同事务逻辑层概念应用直接用保证一组 SQL 原子执行。MVCC存储引擎底层机制对应用透明负责无锁并发读。目标不同事务目标保证 ACID要么全成功要么全回滚。MVCC 目标在保证隔离性的前提下解决脏读、不可重复读提升并发。功能范围不同事务管原子性、一致性、隔离性、持久性。MVCC 只管多版本、可见性判断、快照读的隔离。MVCC 不管崩溃恢复不管持久化不管回滚本身。能否独立存在事务可以脱离 MVCC 存在纯锁也能实现事务。MVCC 绝对不能脱离事务存在。没有事务 ID、没有活跃事务集合、没有 undo 生命周期MVCC 直接废了。生命周期不同事务begin → commit/rollback结束就消失。MVCC 版本跨多个事务存在直到没人用才被 purge 清理。3.2 内在联系MVCC 是事务隔离性的核心实现方式RC、RR 隔离级别主要靠 MVCC 支撑。事务为 MVCC 提供运行环境事务 ID、ReadView、undo log、提交策略都是 MVCC 的基础。InnoDB 事务 MVCC 锁 redo/undoMVCC 做无锁读锁做写写互斥、当前读互斥redo 保证持久化undo 保证原子性 MVCC 版本长事务坑事务更坑 MVCC事务持有锁太久 → ReadView 不释放 → 版本无法清理 → 版本链爆炸 → 查询变慢。一句话记死事务是功能MVCC 是实现高性能事务的核心技术。四、ReadViewMVCC 的灵魂可见性判断规则一个事务到底能看见哪个版本全靠ReadView一致性视图说了算。4.1 ReadView 里存了什么四个关键字段m_ids生成视图时所有正在活跃、没提交的事务 ID 集合。min_trx_idm_ids 里最小的事务 ID。max_trx_id生成视图时下一个要分配的事务 ID。creator_trx_id当前事务自己的 ID。4.2 可见性判断四步法面试必考从最新版本开始依次判断如果版本的 trx_id 自己的 ID→ 自己改的可见。如果版本 trx_id min_trx_id→ 这条数据在我启动前就提交了可见。如果版本 trx_id ≥ max_trx_id→ 这条数据是我启动后才生成的不可见。如果在 min 和 max 之间不在 m_ids 里 → 已经提交 →可见在 m_ids 里 → 还没提交 →不可见不可见就顺着回滚指针往前找直到找到可见版本或者找不到。这就是 MVCC 最核心的算法。看懂这一段你已经超过 60% 后端开发。五、RC 和 RR 的本质区别就差一个 ReadView面试必问RC、RR 隔离级别底层到底差在哪答案极其简单什么时候生成 ReadView。5.1 RR可重复读MySQL 默认事务启动时生成一次 ReadView整个事务期间从头到尾只用这一个视图所以多次查询结果一模一样 →避免不可重复读快照读不会出现幻读5.2 RC读已提交每执行一条普通 SELECT都生成新的 ReadView每次都能看到最新已提交数据只避免脏读允许不可重复读但更轻量、并发更高、锁更少5.3 幻读到底解决没很多人被搞晕快照读普通 selectMVCC 解决幻读当前读for update /update靠 next-key lock 解决幻读MVCC 不是万能的它只管快照读。六、快照读 vs 当前读90% 人用错 MVCC一个超级关键的认知MVCC 只作用于快照读当前读和 MVCC 无关6.1 快照读MVCC 主场普通查询sqlSELECT * FROM t WHERE id1;不加锁读写不阻塞高并发神器完全走 MVCC 多版本6.2 当前读锁主场这些语句都是当前读SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODEUPDATE / DELETE / INSERT它们读取最新已提交数据加行锁、gap lock、next-key lock和 MVCC 无关会阻塞会竞争所以记住MVCC 优化读锁保护写。缺一不可。七、Undo Log Purge 线程MVCC 的 “清洁工”版本不能永远留着谁来清理undo log 存历史版本purge 线程负责垃圾回收7.1 Undo Log 分两种insert undo只用来回滚事务提交就能删。update undo给 MVCC 提供历史版本必须等所有 ReadView 不用了才能删。7.2 Purge 线程是干嘛的清理标记删除的记录清理无用历史版本回收表空间如果 purge 跟不上后果ibd 文件暴涨版本链越来越长查询从 1ms 变 1s数据库越来越卡而导致 purge 失效的元凶只有一个长事务。八、为什么说长事务是 MVCC 天敌线上血泪教训长事务 开启事务后很久不提交。它对 MVCC 的杀伤是毁灭性的ReadView 长期不释放历史版本无法清理undo log 疯狂膨胀版本链巨长查询遍历成本爆炸锁持有时间长死锁、超时满天飞线上真实案例一个 2 小时未提交事务直接把 undo 干到 50GB核心接口全面超时。铁律任何业务都必须禁止长事务查看长事务 SQLsqlSELECT * FROM information_schema.innodb_trx WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) 60;九、如何正确使用 MVCC 大幅提升性能实战干货懂原理不算牛能用 MVCC 把系统性能打上去才是真牛。9.1 合理选择隔离级别订单、支付、交易核心RR可重复读避免脏读 不可重复读一致性最强高并发、后台系统、非金融RC读已提交只避免脏读允许不可重复读性能更好RC 优势锁范围更小更少 gap lockpurge 更及时并发更高9.2 尽量用快照读少加锁能不加锁就不加锁sql-- 推荐MVCC 无锁 SELECT name FROM user WHERE id1; -- 不推荐没必要加锁 SELECT name FROM user WHERE id1 FOR UPDATE;9.3 绝对禁止长事务事务内不要调 HTTP、RPC、第三方接口不要 sleep不要开着事务去等人工操作事务执行时间尽量 1s9.4 避免大事务、批量更新拆小大事务会生成巨量版本拖垮 purge 和查询。9.5 优先走主键、唯一索引MVCC 从聚簇索引开始遍历主键查询最快。9.6 监控 purge 状态plaintextSHOW ENGINE INNODB STATUS;看History list length过高说明 purge 阻塞。十、MVCC 性能提升到底强在哪为什么用上 MVCC并发能明显提升彻底消除读阻塞写、写阻塞读读旧版写新版互不排队。90% 查询无锁锁竞争大幅下降CPU 不用频繁等待、唤醒吞吐量暴涨。死锁概率明显降低锁越少冲突越少死锁越少。高并发读场景性能提升几倍到十几倍读多写少系统MVCC 就是神器。IO 更低、内存更稳无锁竞争系统抖动更小。十一、面试高频误区背会直接加分MVCC 可以替代锁错。MVCC 只管快照读写和当前读必须靠锁。MVCC 完全解决幻读错。只解决快照读幻读当前读靠 next-key lock。事务一提交版本立刻删除错。要等所有 ReadView 不再引用才会被 purge。所有 SELECT 都是快照读错。加锁查询、串行化隔离级别都不是。MVCC 实现了事务的 ACID错。MVCC 只参与隔离性不管原子性、持久性。RC 已经解决不可重复读错。RC 只解决脏读不解决不可重复读RR 才解决。十二、总结看完这一段你就彻底通透了MVCC 是 InnoDB 高并发的灵魂核心逻辑其实非常清晰事务是逻辑功能MVCC 是底层实现技术脏读读到未提交数据不可重复读同一事务多次查询结果不一致每行数据靠隐藏字段 undo log 形成版本链ReadView 决定可见性是 MVCC 核心RR 共用一个视图解决不可重复读RC 每次查询新建视图只解决脏读快照读无锁当前读加锁长事务是 MVCC 最大杀手合理使用 MVCC能让系统并发能力大幅提升从面试到实战从原理到性能这一篇足够你吃透 MVCC。下次再有人问你 MVCC你可以直接笑着讲完整条链路。欢迎关注我后续会持续输出✅ MySQL 高频面试题 ✅ MySQL 性能优化实战✅ Windows Linux 运维干货✅ 后端开发、高并发、数据库调优系列教程✅ 不定期分享可直接落地的配置模板与脚本

相关文章:

MySQL 高并发核心:MVCC 底层原理彻底讲透,一篇吃透面试 + 实战 + 性能优化

前言:为什么你总搞不懂 MVCC,却又处处离不开它?只要做 MySQL 开发、面试、调优,MVCC 绝对是绕不开的大山。有人背了三遍概念,一到面试就被问懵:什么是脏读、不可重复读、幻读?RC 和 RR 到底差在…...

Chord在科研视频处理中的应用:实验过程帧级语义标注与行为时序建模

Chord在科研视频处理中的应用:实验过程帧级语义标注与行为时序建模 1. 引言:科研视频分析的挑战与机遇 在科学研究领域,特别是生物学、心理学、医学和工程学等学科中,实验过程视频记录已成为不可或缺的研究手段。研究人员通过视…...

清音听真实战案例:Qwen3-ASR-1.7B在会议纪要场景的100%标点还原效果

清音听真实战案例:Qwen3-ASR-1.7B在会议纪要场景的100%标点还原效果 1. 引言:当AI“听懂”了会议的呼吸与停顿 想象一下这个场景:一场持续两小时的产品需求评审会刚刚结束。你看着录音文件,想到要逐字逐句地整理成会议纪要&…...

百川2-13B量化模型+OpenClaw:低成本搭建24/7内容摘要服务

百川2-13B量化模型OpenClaw:低成本搭建24/7内容摘要服务 1. 为什么需要本地化内容摘要服务 在信息爆炸的时代,我们每天都会接触到大量网页内容。从行业报告到技术文档,从新闻资讯到研究论文,手动阅读和整理这些内容既耗时又低效…...

PP-DocLayoutV3开发者案例:对接LangChain文档加载器,输出标准Unstructured格式

PP-DocLayoutV3开发者案例:对接LangChain文档加载器,输出标准Unstructured格式 1. 项目背景与需求 在实际的文档处理流程中,我们经常需要将各种格式的文档(PDF、图片、扫描件等)转换为结构化的数据,以便后…...

SEO_电商网站SEO优化全攻略,驱动销售额增长

SEO:电商网站SEO优化全攻略,驱动销售额增长 在当今数字化时代,电子商务已成为企业赢得市场份额和提升销售额的重要途径。仅仅拥有一个电商网站并不足以吸引大量流量和转化成交。这时,电商网站SEO优化就显得尤为重要。本文将详细介绍电商网站…...

Python爬虫实战:用Qwen2.5-VL智能解析网页图片内容

Python爬虫实战:用Qwen2.5-VL智能解析网页图片内容 1. 引言 你有没有遇到过这样的情况:爬取了大量网页图片,却要人工一张张查看内容?或者需要从海量图片中筛选出特定类型的商品、识别图中的文字信息?传统爬虫只能获取…...

AI写春联真简单:春联生成模型-中文-base 新手零基础教程

AI写春联真简单:春联生成模型-中文-base 新手零基础教程 春节将至,贴春联是中国人最重要的年俗之一。但你是否遇到过这样的困扰:想写一副好春联却缺乏灵感,或者书法不够漂亮不好意思贴出来?现在,有了AI技术…...

如何通过SEO总监的工作经验提升个人价值

SEO总监的工作经验:如何提升个人价值 在当今数字化时代,SEO(搜索引擎优化)已经成为各行各业不可或缺的一部分。作为一名SEO总监,你不仅要了解如何提升企业网站的搜索排名,更要通过自己的工作经验提升个人价…...

小白友好型OCR文字识别镜像:无需深度学习基础,开箱即用体验

小白友好型OCR文字识别镜像:无需深度学习基础,开箱即用体验 1. 为什么选择这款OCR镜像? 在日常工作和生活中,我们经常需要从图片中提取文字信息 - 可能是扫描的文档、拍摄的发票、或是路牌照片。传统OCR软件要么功能有限&#x…...

新手必看!阿里通义Z-Image-Turbo WebUI常见问题与解决指南

新手必看!阿里通义Z-Image-Turbo WebUI常见问题与解决指南 1. 快速入门:认识Z-Image-Turbo WebUI 阿里通义Z-Image-Turbo WebUI是一款基于扩散模型的AI图像生成工具,由开发者科哥二次开发构建。它最大的特点是支持"一步生成"技术…...

科研助手实战:OpenClaw调用Qwen3-32B实现论文摘要与归类

科研助手实战:OpenClaw调用Qwen3-32B实现论文摘要与归类 1. 为什么需要自动化文献管理 作为一名经常需要阅读大量文献的研究者,我长期被两个问题困扰:一是下载的PDF论文堆积如山却难以快速定位关键内容;二是手动整理文献耗时耗力…...

intv_ai_mk11Web界面定制化:Gradio配置修改指南,支持自定义标题/Logo/欢迎语

intv_ai_mk11 Web界面定制化:Gradio配置修改指南,支持自定义标题/Logo/欢迎语 1. 为什么需要定制化Web界面 当你部署好intv_ai_mk11 AI对话机器人后,默认的Web界面可能无法完全满足你的需求。通过Gradio框架提供的配置选项,你可…...

ComfyUI 高频报错排查与修复指南(实战经验总结)

1. ComfyUI环境依赖冲突的终极解决方案 第一次打开ComfyUI就遇到红色报错提示?八成是环境依赖出了问题。我见过太多开发者在这个环节卡住好几天,其实大部分问题都有固定解法。先别急着重装系统,跟着我的排查清单一步步来。 最常见的环境冲突往…...

Kandinsky-5.0-I2V-Lite-5s部署教程:Linux服务器supervisor配置+开机自启设置

Kandinsky-5.0-I2V-Lite-5s部署教程:Linux服务器supervisor配置开机自启设置 1. 环境准备与快速部署 在开始部署Kandinsky-5.0-I2V-Lite-5s之前,我们需要确保服务器环境满足以下要求: 操作系统:Ubuntu 20.04/22.04 LTS&#xf…...

【2026新版】 DirectX Repair 修复工具操作步骤【图文教程】,DirectX修复工具彻底解决DirectX报错与游戏闪退

DLL缺失、游戏闪退及DirectX错误 要怎么处理?DirectX修复工具可以快速修复DLL缺失、游戏闪退及DirectX错误,支持一键扫描和自动修复。DirectX修复工具是一款专门给 Windows 系统打补丁的小程序,可以把电脑里缺失或损坏的 DirectX 文件重新补全…...

一键部署GLM-4.6V-Flash-WEB:GitCode镜像真香,省去半天环境搭建时间

一键部署GLM-4.6V-Flash-WEB:GitCode镜像真香,省去半天环境搭建时间 1. 为什么选择GLM-4.6V-Flash-WEB 在多模态大模型快速发展的今天,开发者最头疼的不是模型性能,而是如何快速部署和运行。GLM-4.6V-Flash-WEB作为智谱AI最新开…...

seo兼职如何做外链建设_seo兼职如何进行社交媒体优化

SEO兼职如何做外链建设 在当今互联网时代,外链建设无疑是SEO(搜索引擎优化)中最重要的一环。对于SEO兼职者来说,如何有效地进行外链建设是一项必须掌握的技能。本文将从问题分析、原因说明、解决方法及注意事项四个方面&#xff…...

[GROMACS]氢键分析工具的版本迭代:“-life”等参数的消失

引言:一次意外的发现 “为什么我的GROMACS没有gmx hbond中的-life参数?” 当我在Windows终端中输入gmx hbond -h,仔细翻看帮助文档中每一个参数,却始终找不到期待已久的-life选项时,一种困惑油然而生。氢键寿命分析&…...

被裁两次,赔了30万,我真得感谢公司。21年赔10万,24年赔20万,平时月光,全靠裁员攒下第一桶金

今天刷到一个帖子,一个程序员说自己被裁了两次,21年赔了10万,24年赔了20万,加起来30万。他说平时一分钱都攒不下,全靠这两次裁员才有了存款,真得感谢公司。我第一反应是:这话听着挺魔幻&#xf…...

Qwen3-ASR-1.7B语音识别进阶指南:上下文联想纠错机制原理与提示词增强技巧

Qwen3-ASR-1.7B语音识别进阶指南:上下文联想纠错机制原理与提示词增强技巧 1. 引言:从“听清”到“听懂”的跨越 如果你用过一些基础的语音转文字工具,可能会遇到这样的困扰:明明每个字都识别出来了,但连成句子却感觉…...

卡证检测矫正模型Web界面使用教程:中文操作+实时结果可视化

卡证检测矫正模型Web界面使用教程:中文操作实时结果可视化 你是不是经常需要处理身份证、护照、驾照这些卡证图片?比如要上传证件照办业务,或者批量处理一堆证件材料。最头疼的就是拍出来的照片歪歪扭扭,背景杂乱,还得…...

单向链表的创建、插入、删除、遍历

文章目录单向链表:从创建到操作全解析 📝1. 单向链表的基本概念 🧠2. 实现单向链表 🛠️2.1 定义节点类2.2 创建链表3. 插入操作 ➕3.1 在头部插入3.2 在尾部插入3.3 在特定位置插入4. 删除操作 ❌4.1 删除头部节点4.2 删除特定值…...

Qwen3-14B Function Calling功能详解:让AI不仅能说,更能实干

Qwen3-14B Function Calling功能详解:让AI不仅能说,更能实干 你有没有想过,让AI不仅能和你聊天,还能帮你查天气、订机票、甚至处理工作流程?这听起来像是科幻电影里的场景,但现在,通过Qwen3-14…...

CosyVoice多语言语音合成实测:中英文混合文本生成,自然流畅

CosyVoice多语言语音合成实测:中英文混合文本生成,自然流畅 1. 测试环境与模型介绍 1.1 测试硬件配置 本次测试使用的硬件环境如下: 组件规格GPUNVIDIA RTX 4090 (24GB)CPUIntel i9-13900K内存64GB DDR5操作系统Ubuntu 22.04 LTS 1.2 Co…...

Phi-3-Mini-128K效果实测:128K长上下文代码分析与摘要生成

Phi-3-Mini-128K效果实测:128K长上下文代码分析与摘要生成 最近,一个名为Phi-3-Mini-128K的模型在开发者社区里引起了不小的讨论。大家关注的焦点,不是它有多大的参数量,而是它那个惊人的“128K”上下文长度。简单来说&#xff0…...

Pixel Couplet Gen 提示词工程详解:如何生成更精准的像素春联

Pixel Couplet Gen 提示词工程详解:如何生成更精准的像素春联 1. 前言:为什么需要学习提示词工程 用Pixel Couplet Gen生成像素风格的春联看似简单,但要让AI真正理解你的需求并不容易。很多新手会遇到这样的问题:生成的春联要么…...

地理信息系统知识点03---空间数据模型

一、地理空间与空间抽象1. 地理空间地理空间是 GIS 的描述与分析对象,泛指地球表层空间及其相关的关联空间,既包含具有地理位置的实体、现象,也涵盖它们之间的相互作用与分布规律。从内涵上,地理空间具有区域性、多维性、随机性、…...

GLM-OCR嵌入式部署轻量化实践:从服务器到边缘设备的模型压缩

GLM-OCR嵌入式部署轻量化实践:从服务器到边缘设备的模型压缩 最近在做一个智能零售柜的项目,需要实时识别商品包装上的文字信息。一开始我们用的是云端API,识别效果确实不错,但网络延迟和稳定性成了大问题——有时候网络一波动&a…...

小白友好:Python3.11镜像部署与常用库安装指南

小白友好:Python3.11镜像部署与常用库安装指南 1. Python3.11镜像简介 Python是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名。本镜像基于Miniconda-Python3.11构建,是一个轻量级的Python环境管理工具,能让你快速…...