MVCC(Multi‑Version Concurrency Control,多版本并发控制)通过为数据维护多个历史版本,并配合一致性读视图(Read View)来避免脏读。下面从概念和流程两个层面说明它是如何做到的。
脏读:一个事务读到了另一个事务尚未提交的数据。
如果那个事务随后回滚,读到的数据就是“脏”的、不存在的数据。
读不加锁,写不阻塞读,通过版本判断可见性。
MVCC 的关键机制包括:
InnoDB 中,每一行记录包含:
trx_id:最后一次修改该行的事务 IDroll_pointer:指向 undo log(历史版本)当一个事务执行**一致性读(普通 SELECT)**时:
当读取一行数据时:
trx_id 与 Read View| 情况 | 是否可见 |
|---|---|
trx_id < 最小活跃事务 ID |
✅ 可见(已提交) |
trx_id 在活跃事务列表中 |
❌ 不可见(未提交) |
trx_id ≥ 下一个事务 ID |
❌ 不可见(未来事务) |
| 否则 | ✅ 可见 |
如果当前版本不可见:
roll_pointer 找 undo log 中的上一个版本trx_id 一定在 Read View 的活跃事务列表中永远不会读到其他事务未提交的数据
| 机制 | 是否避免脏读 | 特点 |
|---|---|---|
| 加锁读(SELECT FOR UPDATE) | ✅ | 阻塞写 |
| MVCC 一致性读 | ✅ | 非阻塞、高性能 |
| 读未提交(Read Uncommitted) | ❌ | 直接读最新数据 |
MVCC 通过 Read View 判断数据版本的可见性,只读取“已经提交且对当前事务可见”的版本,从而天然避免脏读。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。