MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库(如 MySQL InnoDB、PostgreSQL)用来在不加锁或少加锁的情况下,实现并发读写并保证一致性的核心机制。
下面从「一致性问题是什么」→「MVCC 怎么做」→「为什么能保证一致性」三个层次说明。
MVCC 主要保证的是 事务级一致性(隔离性),尤其是:
它不直接保证:
给数据存多个版本,让不同事务看到自己“该看到”的那个版本
InnoDB 每行记录包含:
DB_TRX_ID:最后修改该行的事务 IDDB_ROLL_PTR:回滚指针,指向 undo log 中的旧版本每次更新:
形成一条 版本链:
最新版本 → 上一版本 → 上上版本 → ...
每个事务有:
ReadView 记录:
一个数据版本对当前事务可见,当且仅当:
✅ 修改该版本的事务:
否则:
roll_ptr 找上一个版本T1: 开始事务(ReadView A)
T2: 开始事务(ReadView B)
T2: UPDATE user SET age=30 WHERE id=1;
T2: COMMIT;
T1: SELECT age FROM user WHERE id=1;
结果:
✅ 保证了 可重复读一致性
| 问题 | 是否解决 |
|---|---|
| 脏读 | ✅ |
| 不可重复读(RR) | ✅ |
| 读写互相阻塞 | ✅ |
| 问题 | 说明 |
|---|---|
| 写写冲突 | 靠锁(行锁) |
| 幻读(部分) | 需 Next-Key Lock |
| 业务一致性 | 需事务 + 逻辑 |
MVCC 通过“数据多版本 + 事务快照(ReadView)+ 可见性规则”,让每个事务只看到符合自己一致性视图的数据,从而在不加锁的情况下保证读一致性。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。