SQL MVCC 的核心思想

MVCC通过为数据保留多个历史版本,使事务基于启动时刻的一致性快照读取,实现读写互不阻塞;其依赖版本链、Read View和DB_TRX_ID/DB_ROLL_PTR等隐藏字段,避免锁冲突,提升并发性能。

MVCC 的核心思想是:为数据保留多个历史版本,让每个事务基于自身启动时刻看到一个一致性的快照,从而实现读写互不阻塞。

多版本共存,不覆盖原数据

每次更新或删除一行时,InnoDB 不直接覆盖原有记录,而是生成一个新版本,并用 DB_ROLL_PTR 指针把新旧版本串联成一条“版本链”。原始数据依然保留,供其他事务按需读取。

快照读与事务隔离绑定

事务开始时,数据库会记录一个“一致性视图”(Read View),其中包含当时活跃事务 ID 列表和最小/最大事务 ID。后续所有 SELECT 都依据这个视图判断哪些版本可见——只读取在该视图下“已提交且可见”的版本。

隐藏字段支撑版本管理

InnoDB 自动为每行添加三个关键隐藏列:

  • DB_TRX_ID:标记最后一次修改该行的

    事务 ID
  • DB_ROLL_PTR:指向 Undo Log 中前一版本的位置,构成版本链
  • DB_ROW_ID(非主键表中用作隐式主键,辅助唯一性)

解决传统锁机制的根本痛点

在纯锁方案中:

  • 读操作加 S 锁 → 阻塞写操作的 X 锁
  • 写操作加 X 锁 → 阻塞其他事务的 S 锁

MVCC 绕开了这个冲突:读走历史版本,写建新版本,双方无需等待对方释放锁,显著提升并发吞吐量,尤其适合读多写少的业务场景。