Mysql InnoDB多版本并发控制MVCC( 四 )


这样可以保证当前事务从头到尾都是read view中记录的内容是一致的,第一次读取的时候事务A没有提交,那么不可见,但是第二次读取的时候事务A提交了,但是read view的m_ids 和max_trx_id可以判断事务A不可见,比如事务A事务id小于max_trx_id意味着生成read view是事务A启动但是没提交,即使第二次读事务A提交了,但是m_ids中还是包含事务A,那么不可见 。如果事务A事务id大于max_trx_id,那么自然第二次还是大于max_trx_id,也是不可见的,从而实现了可重复读 。
2.4 二级索引与MVCC上面我们提到,innodb聚簇索引组织的记录才具备trx_id和roll_point,那么我们使用二级索引进行查询的时候,如何判断数据是否可见昵?

  1. 二级索引页面的page header中存在page_max_trx_id属性,每当有事务对其中的记录进行增删改查操作的时候,如果事务的事务id,大于page_max_trx_id,那么会更新page_max_trx_id属性值为其事务id,这意味着page_max_trx_id记录了修改该二级索引页面最大的事务id是多少 。当select通过二级索引首先看下对于read view的min_trx_id是否大于该页面的page_max_trx_id,如果大于那么页面中所有记录都对该read view可见,否则就进行下面的第二步
  2. 利用二级索引中的主键值,进行回标,得到对应的聚簇索引记录然后进行回表,然后通过2.2中步骤拿到第一个可见版本的数据,然后比对此纪录和通过二级索引查询得到记录的值是否相同,如果相同那么发送给客户端,否则跳过该记录 。
【Mysql InnoDB多版本并发控制MVCC】

经验总结扩展阅读