Read View在MVCC中如何工作

Read View的定义

  • 快照视图: Read View是MVCC(多版本并发控制)中的一个概念,表示在某个时间点上数据库的一个快照。它包含了当前正在执行的事务以及它们的状态(如活跃、已提交、已回滚)。
  • 事务隔离: Read View允许事务在读取数据时看到一个一致的视图,即使其他事务正在修改数据。这种机制确保了事务隔离性,避免了脏读、不可重复读和幻读等问题。

Read View的工作原理

Read View的四个字段:

  • m_ids:在创建该Read View时,所有活跃事务的ID列表。
  • min_trx_id:在创建该Read View时,所有活跃事务ID的最小值。
  • max_trx_id:在创建该Read View时,所有活跃事务ID的最大值+1。
  • creator_trx_id:创建该Read View的事务ID。

聚簇索引记录中两个跟事务有关的隐藏列:

  • trx_id:当一个事务对某条聚簇索引记录进行改动时,就会把该事务id记录在该记录的trx_id列中。
  • roll_pointer:每次对某条聚簇索引记录修改时,会把旧版本记录写到undo日志中,roll_pointer负责指向undo日志中旧版本记录的位置。

创建Read View后的三种情况:

当有事务访问记录时,会有以下几种情况:

  • trx_id < min_trx_id:说明该记录的修改事务在创建Read View之前就已经提交了,因此该记录对当前事务可见
  • trx_id >= max_trx_id:说明该记录的修改事务在创建Read View之后才开始的,因此该记录对当前事务不可见
  • min_trx_id <= trx_id < max_trx_id,需要判断trx_id是否在m_ids中:
    • 如果trx_id在m_ids中,说明该记录的修改事务在创建Read View时是活跃的,因此该记录对当前事务不可见
    • 如果trx_id不在m_ids中,说明该记录的修改事务在创建Read View时已经提交了,因此该记录对当前事务可见

这种通过「版本链」来控制并发事务访问同一个记录时的行为就叫MVCC(多版本并发控制)


可重复读与读已提交

可重复读:启动事务时生成一个Read View,在该事务提交前都使用该Read View。
读已提交:每次读取数据时都生成一个新的Read View,因此每次读取数据时看到的都是最新的提交数据。