MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库(如 MySQL InnoDB、PostgreSQL、Oracle 等)用来在保证高并发的同时,维持数据一致性和事务隔离性的核心机制。
下面从“它要解决什么问题 → 核心原理 → 如何保证一致性”三个层次说明。
在并发场景下:
MVCC 的目标:
让“读不阻塞写,写不阻塞读”,同时保证事务看到的数据是一致的
一句话:保存数据的多个版本,让不同事务看到不同时间点的数据快照
关键组成部分(以 MySQL InnoDB 为例):
每行记录包含:
DB_TRX_ID:最后一次修改该记录的事务 IDDB_ROLL_PTR:回滚指针,指向 undo log 中的旧版本trx_id普通 SELECT 是 快照读:
✅ 结果:同一个事务内多次读,结果一致(可重复读)
UPDATE / DELETE / SELECT ... FOR UPDATE 是 当前读:
✅ 结果:写操作基于“最新真实数据”,不会写丢
判断规则简化版:
trx_id < 当前事务 ID 且已提交 → 可见✅ 每个事务都像在“自己的时间切片”里操作
| 隔离级别 | MVCC 行为 |
|---|---|
| 读未提交 | 基本不用 MVCC |
| 读已提交(RC) | 每次读生成新 ReadView |
| 可重复读(RR) | 事务开始生成一次 ReadView(MySQL 默认) |
| 串行化 | 依赖锁,而非 MVCC |
✅ MVCC 主要服务 RC 和 RR
MVCC 通过“数据多版本 + 事务快照(ReadView)+ undo log”,让每个事务看到一致的数据视图,从而在无锁读的情况下保证数据一致性。
如果你愿意,我也可以用**流程图 / 例子(两个事务同时改同一行)**来更直观地说明。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。