MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种数据库并发控制机制,核心思想是:对同一数据保存多个历史版本,读写互不阻塞,从而提升并发性能并保证事务隔离性。
在没有 MVCC 的情况下,数据库通常使用锁:
这会导致:
MVCC 的目标是:
读不加锁,写不阻塞读
同一行数据可以有多个版本:
InnoDB 每行记录中隐含以下字段:
| 字段 | 作用 |
|---|---|
DB_TRX_ID |
最后修改该行的事务 ID |
DB_ROLL_PTR |
回滚指针,指向 undo log |
DB_ROW_ID |
行 ID(可选) |
Read View 决定:
当前事务能看到哪些版本的数据
Read View 包含:
判断规则(简化版):
| 数据版本的事务 ID | 是否可见 |
|---|---|
| < 最小活跃事务 ID | ✅ 可见 |
| > 当前事务 ID | ❌ 不可见 |
| 在活跃事务列表中 | ❌ 不可见 |
| 否则 | ✅ 可见 |
事务 B 修改一行数据:
DB_TRX_ID = 101事务 A 查询该行:
DB_TRX_ID = 101 比自己新✅ 事务 A 读到的仍是事务开始时的数据快照
| 隔离级别 | 是否使用 MVCC |
|---|---|
| READ UNCOMMITTED | ❌ |
| READ COMMITTED | ✅(每次读生成新 Read View) |
| REPEATABLE READ | ✅(事务开始时生成 Read View) |
| SERIALIZABLE | ❌(通常退化为锁) |
MySQL InnoDB 的 REPEATABLE READ 是依靠 MVCC 实现的
MVCC 通过保存数据的多个历史版本,让不同事务看到不同时间点的数据,从而实现无锁读、高并发和事务隔离。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。