MVCC(多版本并发控制)理解与改进

概述

MVCC(Multi-Version Concurrency Control)是一种无锁的并发控制机制,主要用于实现数据库事务的隔离级别,如读已提交和可重复读。其核心思想是通过维护数据的多个版本来支持并发的读写操作。

实现机制如下

事务与数据版本

假设有两个事务,事务A和事务B:

  1. 事务A对数据进行修改,将“张三”改为“李四”。此时:

    • “李四”是最新的数据。
    • “张三”是旧数据,保存在undo log(回滚日志)中。
  2. 每条记录包含三个隐藏列,其中一个是回滚指针,用于连接旧版本,形成一个链表。链表的首节点是当前最新的记录。

  3. 隐藏字段中还有一个字段记录当前操作的事务ID。例如,事务A的ID是10,则“李四”这条记录的存的事务ID为10。

读视图的生成

当事务B进行查询时,会生成一个读视图(Read View),该视图维护以下四个属性:

  1. 当前事务ID:假设事务B的ID是20。
  2. 当前最小未提交事务ID:表示当前活跃的未提交事务中,最小的事务ID。
  3. 下一个事务ID:如果当前最大事务ID是20,则这里是21。
  4. 所有未提交事务集合:按事务ID从小到大排序的集合。

数据读取规则

在查询时,按照以下规则判断可读取的数据:

  1. 当前事务ID与数据事务ID对比

    • 如果相等,表示该数据是当前事务操作的,可以直接读取。
  2. 数据事务ID小于当前最小未提交事务ID

    • 表示该数据已提交。如果当前隔离级别是读已提交,可以直接读取数据。
  3. 数据事务ID大于下一个事务ID

    • 表示该数据在创建读视图后被修改,不能读取,进行下一条数据判断。
  4. 数据事务ID在最小和最大事务ID之间

    • 表示该数据正被当前活跃的未提交事务操作。如果当前隔离级别是读已提交,则不能读取,进行下一条数据判断。

通过上述规则逐一匹配,可以找到最终要读取的数据。