MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种通过保存数据的多个历史版本来实现并发控制的机制,常见于 MySQL(InnoDB)、PostgreSQL 等数据库。
下面从核心思想 → 实现结构 → 读写流程 → 与锁的关系 → 优缺点来系统说明。
读写互不阻塞,读不阻塞写,写不阻塞读
MVCC 的核心思想是:
InnoDB 的每一行记录中,除了业务字段,还包含:
| 字段 | 作用 |
|---|---|
trx_id |
最后修改该行的事务 ID |
roll_pointer |
指向 undo log 中旧版本记录的指针 |
roll_pointer 形成版本链最新版本 → 旧版本 → 更旧版本 → ...
Read View 决定了:
当前事务能看到哪些版本的数据
Read View 中通常包含:
m_ids:当前活跃的事务 ID 列表min_trx_id:最小活跃事务 IDmax_trx_id:下一个将被分配的事务 IDcreator_trx_id:当前事务 IDInnoDB 使用 快照读(Snapshot Read):
流程:
给定一个数据版本的 trx_id:
| 情况 | 是否可见 |
|---|---|
trx_id < min_trx_id |
✅ 可见(已提交) |
trx_id >= max_trx_id |
❌ 不可见(未来事务) |
trx_id 在活跃事务列表中 |
❌ 不可见 |
trx_id == 当前事务 ID |
✅ 可见 |
写操作并不是直接覆盖数据,而是:
trx_idroll_pointer✅ 写仍然需要锁
✅ 读不需要锁(MVCC 的优势)
| 隔离级别 | MVCC 行为 |
|---|---|
| READ UNCOMMITTED | 几乎不用 MVCC |
| ✅ READ COMMITTED | 每次 SELECT 生成新的 Read View |
| ✅ REPEATABLE READ | 事务开始时生成一次 Read View(InnoDB 默认) |
| SERIALIZABLE | 退化为锁机制 |
| 机制 | 作用 |
|---|---|
| MVCC | 控制读一致性 |
| 锁(行锁、间隙锁) | 控制写冲突 |
总结一句话:
MVCC 解决“读一致性”,锁解决“写冲突”
MVCC 通过保存数据的多个历史版本,配合事务 ID、undo log 和 Read View,让不同事务看到不同时间点的数据快照,从而实现无锁的一致性读。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。