首页 >> 基础教程

MVCC原理及数据库实现详解

      MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库管理系统(如MySQL InnoDB、PostgreSQL、Oracle等)实现高并发访问的核心技术。它通过在读操作时不加锁来解决读写冲突,显著提升了数据库的并发性能。其核心思想是:为每个修改保留多个版本的数据,使得读操作可以访问特定版本的数据而不被写操作阻塞

MVCC 核心原理

  1. 数据版本化存储

    1. 每次对数据进行修改(INSERT/UPDATE/DELETE)时,不直接覆盖原数据,而是创建该数据的一个新版本。

    2. 旧版本数据被保留在特定区域(如MySQL的Undo Log、PostgreSQL的Heap)。

    3. 每个数据版本关联两个关键字段:

      1. 创建事务ID(Create TXID):创建该版本的事务ID。

      2. 删除事务ID(Delete TXID):删除该版本的事务ID(初始为NULL)。

  2. 事务快照(Snapshot)

    1. 事务启动时,会生成一个一致性视图(Read View),记录当前活跃事务ID列表。

    2. 通过快照确定哪些数据版本对该事务可见:

      1. 只显示在快照创建前已提交的数据版本。

      2. 忽略未提交或快照创建后提交的数据。

  3. 可见性判断规则

    1. 事务根据快照判断数据版本的可见性:

    2. 可见:数据版本的 Create TXID < 当前事务快照ID 且:

      1. Delete TXID = NULL(未被删除),或

      2. Delete TXID > 当前事务快照ID(在快照后被删除)。

    3. 不可见

      1. Create TXID 属于活跃事务(未提交),或

      2. Create TXID > 当前事务快照ID(在快照后创建),或

      3. Delete TXID < 当前事务快照ID(在快照前已被删除)。

MVCC 在 MySQL InnoDB 中的实现

关键结构:

  • 隐藏字段

    • DB_TRX_ID:最近修改该行的事务ID。

    • DB_ROLL_PTR:指向Undo Log中旧版本数据的指针。

  • Undo Log

    • 存储历史版本数据,通过DB_ROLL_PTR形成版本链。

  • Read View

    • m_ids:当前活跃事务ID集合。

    • min_trx_id:最小活跃事务ID。

    • max_trx_id:下一个将分配的事务ID。

    • creator_trx_id:创建该Read View的事务ID。

       版本链示意图
        -------------------
当前行   | Data   | TRX_ID=300 | ROLL_PTR  → 
        -------------------
                     |
                     ↓
        -------------------
Undo Log | Data_v2 | TRX_ID=200 | ROLL_PTR  → 
        -------------------
                     |
                     ↓
        -------------------
Undo Log | Data_v1 | TRX_ID=100 | ROLL_PTR=NULL
        -------------------

总结:

  • MVCC本质:通过保存数据历史版本,实现读操作的无锁访问。

  • 关键机制:事务快照(Read View) + 版本链(通过Undo Log)。

  • 适用场景:读多写少的高并发系统(如电商、社交应用)。

  • MySQL InnoDB:依赖Undo Log + Read View。


最新文章
mysql分页问题2025-08-04
千万数据先insert和先建索引哪个快2025-08-04
MySQL 中大小表关联查询如何优化2025-08-04
sql技巧-每个班年龄排前两名的人2025-08-03
MySQL 导致 cpu 飙升的话,要怎么处理呢?2025-07-29
MySQL 中为千万级大表添加字段2025-07-29
mysql中百万级别以上的数据如何删除2025-07-29
分库分表带来的问题2025-07-29
mysql中常用的分库分表中间件有哪些2025-07-29
mysql不停机扩容2025-07-29
备案号:蜀ICP备2023042032号-1