• 多半版本并发控制

    Read view

  • 每个执行的事务都会生成一个read view

  • InnoDB会为每个事务创建一个数组,保存事务创建时活跃的事务id(已创建但还没提交的事务)

    undo log版本链

  • 修改page cache中某条记录,都会把修改前的数据保存到undo log

  • 每行数据都会包含两个隐藏字段:trx_id(最新修改事物的ID)、roll_pointer(指向上一条undo_log)

    read view结构

  • m_ids:mysql中正在执行的还没提交的事务

  • min_trx_id:m_ids里的最小值
  • max_trx_id:m_ids里的最大值
  • creator_trx_id:当前事务id

    原理

  • 基于undo log,为当前事务生成read view

  • 可以读到的版本数据:自己事务更新的;事务创建之前已经提交事务的修改的
  • 不可以读到的版本数据:生成read view时候正在活跃的事务,在之后提交修改的数据;生成read view之后开启事务提交修改的数据

    RC & Read view

  • read view 实现 RC隔离级别

  • 一个事务每次发起查询,都会重新生成read view

    RR & Read view

  • 可重复读隔离级别实现

  • 一个事务只会在开始的生成一个read view