一句话说清楚
MVCC = 多版本并发控制 = 每个事务看到的是数据库在某个时间点的\”快照\”,而不是实时数据。
用一个生活中的例子理解
场景:银行账户余额查询
想象你在银行查询余额:
没有 MVCC 的情况(加锁)
1. 你开始查询余额:1000元
2. 同时,你老婆在转账:-500元
3. 银行说:\”等等!你老婆正在操作,你等会儿再查\”
4. 你被阻塞,直到转账完成
问题:读操作被写操作阻塞
有 MVCC 的情况
1. 你开始查询余额:1000元
2. 同时,你老婆在转账:-500元
3. 银行说:\”你查你的,她转她的,互不影响\”
4. 你看到的是查询开始时的余额:1000元
5. 你老婆转账完成后,余额变成500元
6. 你下次查询才会看到500元
优点:读写不冲突,读操作看到的是一致性快照
技术原理(核心概念)
MVCC 主要依赖以下三个关键技术来实现:
1. 数据的三个隐藏字段
InnoDB 引擎会为每一行数据自动添加三个我们看不见的隐藏字段:
- DB_TRX_ID(6字节):最近修改/创建本行数据的事务ID。记录是哪个事务生成了这个数据版本。
- DB_ROLL_PTR(7字节):回滚指针。指向这条数据的上一个版本的地址(存储在 Undo Log 中)。它就像一条链表的指针,把同一个数据的多个版本串联起来。
- DB_ROW_ID(6字节):行ID。如果表没有主键,InnoDB 会用它生成聚簇索引。
2. Undo Log(回滚日志)
- 作用:存储数据旧版本的“档案馆”。
- 当一行数据被更新时,旧版本的数据不会立刻删除,而是会被拷贝到 Undo Log 中,并通过 DB_ROLL_PTR 指针形成一个版本链。
- 这个版本链使得事务可以根据需要找到任何历史版本的数据。
</



