Read View在MVCC里如何工作
Read View的结构
Read View中有四个重要的字段:
- m_ids:创建 Read View 时,数据库中启动但未提交的「活跃事务」的事务 id 列表 。
- min_trx_id:创建 Read View 时,「活跃事务」中事务 id 最小的值,即 m_ids 中的最小值 。
- max_trx_id:创建 Read View 时,数据库中应分配给下一个事务的 id 值,为全局事务最大事务 id 值 + 1 。
- creator_trx_id:创建该 Read View 的事务的事务 id 。
聚簇索引记录的两个隐藏列
了解到Read View的字段,我们需要了解聚簇索引记录的两个隐藏列。
对于InnoDB存储引擎的数据库表,它的聚簇索引记录都包含下面两个隐藏列:
- trx_id,当一个事务对某条聚簇索引记录进行改动时,就会把事务的事务id记录在trx_id隐藏列里;
- rool_pointer,每次对某条聚簇索引记录进行改动时,都会把旧版本的记录写入到undo日志中,然后把隐藏列是指针,指向每一个旧版记录,于是就可以通过它找到修改前的记录;
在创建的Read View中,我们可以将记录中的trx_id划分这三种情况:
一个事务去访问记录的时候,除了自己的更新记录总是可见之外,还有这个几种情况:
判断规则
- trx_id 小于 min_trx_id:此记录版本由在创建 Read View 前已提交的事务生成,对当前事务可见。
- trx_id 大于等于 max_trx_id :该记录版本由在创建 Read View 后启动的事务生成,对当前事务不可见。
- trx_id 在 min_trx_id 和 max_trx_id 之间 :
- trx_id 在 m_ids 列表中:生成该版本记录的事务仍活跃(未提交) ,对当前事务不可见。
- trx_id 不在 m_ids 列表中:生成该版本记录的事务已提交 ,对当前事务可见
这种通过版本链来控制并发事务访问同一个记录时的行为就叫MVCC(多版本并发控制)