MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种数据库并发控制机制,用来在不加锁或少加锁的情况下,实现高并发读写,同时保证事务隔离性。
同一份数据保存多个版本,不同事务根据可见性规则读取不同版本。
传统并发控制方式的问题:
| 方式 | 问题 |
|---|---|
| 表锁 / 行锁 | 并发性能差 |
| 读写互斥 | 读阻塞写,写阻塞读 |
MVCC 的优势:
以 MySQL InnoDB 为例。
| 字段 | 含义 |
|---|---|
DB_TRX_ID |
最后修改该行的事务 ID |
DB_ROLL_PTR |
回滚指针,指向 undo log |
DB_ROW_ID |
行 ID(无主键时自动生成) |
DB_ROLL_PTR 形成 版本链当前记录 → undo1 → undo2 → undo3
事务开始时生成 Read View,用于判断哪些版本“可见”。
Read View 包含:
m_ids:当前活跃事务 ID 列表min_trx_id:最小活跃事务 IDmax_trx_id:下一个将被分配的事务 IDcreator_trx_id:当前事务 ID一个版本是否可见,判断逻辑如下:
| 隔离级别 | MVCC 行为 |
|---|---|
| READ COMMITTED | 每次查询生成新的 Read View |
| REPEATABLE READ | 事务开始时生成一次 Read View(默认) |
| READ UNCOMMITTED | 不使用 MVCC |
| SERIALIZABLE | 退化为锁 |
✅ InnoDB 默认 RR 级别就是通过 MVCC 实现的
| 类型 | 示例 | 是否用 MVCC |
|---|---|---|
| 快照读 | SELECT |
✅ 是 |
| 当前读 | SELECT ... FOR UPDATE / UPDATE / DELETE |
❌ 否(加锁) |
MVCC 通过保存数据的多个历史版本,让不同事务读取到符合隔离级别的数据,从而实现无锁或低锁的高并发访问。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。