MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种数据库并发控制机制,核心思想是:
对同一数据保存多个版本,读写互不阻塞,通过版本判断可见性来实现一致性读。
下面从原理、实现、流程、优缺点几个方面系统说明。
传统并发控制方式的问题:
MVCC 的目标:
数据不是直接覆盖更新,而是保留多个版本,通过“版本可见性规则”决定当前事务能看到哪个版本。
关键点:
InnoDB 每行记录中隐藏字段:
| 字段 | 含义 |
|---|---|
DB_TRX_ID |
最后修改该行的事务 ID |
DB_ROLL_PTR |
回滚指针,指向 undo log |
DB_ROW_ID |
行ID(无主键时) |
当前行 → undo1 → undo2 → undo3
事务在第一次读时生成 Read View,用于判断版本可见性。
Read View 包含:
m_ids:当前活跃事务列表min_trx_id:最小活跃事务 IDmax_trx_id:下一个将被分配的事务 IDcreator_trx_id:当前事务 ID判断某行版本是否可见:
如果不可见:
| 类型 | 是否使用 MVCC | 说明 |
|---|---|---|
| 快照读 | ✅ | SELECT(普通) |
| 当前读 | ❌ | SELECT ... FOR UPDATE、UPDATE、DELETE |
✅ 事务 A 看不到事务 B 的修改(可重复读)
✅ 读写不阻塞
✅ 高并发性能
✅ 天然支持 可重复读
✅ 避免大量加锁
❌ 只适用于 读已提交 / 可重复读
❌ 需要维护 undo log(空间、清理)
❌ 无法防止 幻读(InnoDB 用 Next-Key Lock 解决)
❌ 写仍然需要锁
| 数据库 | MVCC 实现 |
|---|---|
| MySQL InnoDB | undo log + Read View |
| PostgreSQL | tuple + xmin/xmax |
| Oracle | undo segment |
| SQL Server | 行版本存储 |
MVCC 通过保存数据的多个历史版本,让读操作基于“快照”而不是最新数据,从而避免加锁,提高并发性能。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。