暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql数据库 MVCC 多版本并发控制

Mark 2026-06-12
115

要通俗地理解 MVCC(多版本并发控制),你可以把它想象成“给数据拍快照”或者“图书馆保留旧版书”的机制。
它的核心思想非常简单:不直接覆盖旧数据,而是为每次修改生成一个新版本,让不同的事务能看到自己“该看”的历史版本,从而实现读写互不打扰。
为了让你快速掌握它的精髓,我们可以从以下三个维度来拆解:
1. 为什么需要 MVCC?(解决痛点)
在没有 MVCC 的传统数据库里,如果有人在修改(写)一条数据,其他人就不能读这条数据,必须排队等锁。这就像一本字典只有一本,有人正在用笔修改时,别人就只能干等。
MVCC 的出现就是为了实现“读写不互斥”:读操作不需要加锁就能读到一致的数据,大幅提升了数据库的高并发性能。
2. 底层是怎么实现的?(三大核心组件)
以 MySQL InnoDB 引擎为例,它主要靠以下三个“法宝”来实现 MVCC:
隐藏字段(身份证):InnoDB 会偷偷给每行记录加上隐藏字段,最重要的是 DB_TRX_ID(记录最后一次修改该行的事务ID)和 DB_ROLL_PTR(回滚指针)。
Undo Log(历史档案/版本链):当你执行 UPDATE 或 DELETE 时,数据库不会直接抹掉旧数据,而是把旧数据复制到 Undo Log 中保存起来。通过回滚指针,这些旧版本会被串联成一条“版本链”。
Read View(一致性快照):当你的事务开启并执行 SELECT 查询时,数据库会为你生成一个 Read View(相当于给你发了一张带有时间戳的“通行证”)。你拿着这张通行证去比对版本链上的数据,只要符合你的时间视角,就展示给你看;不符合的,就顺着链子继续往前找旧版本。
3. 它能解决什么问题?
在 MySQL 默认的“可重复读(RR)”隔离级别下,MVCC 能够完美解决并发带来的三大难题:
脏读:不会读到别人还没提交的“草稿”。
不可重复读:同一个事务内多次读取同一行数据,结果始终一致(因为你一直在看自己事务开始时的快照)。
配合锁机制解决幻读:虽然 MVCC 本身只能保证读到旧版本,但结合我们之前聊过的 Next-Key Lock,就能防止新数据的插入,从而彻底避免幻读。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论