1、 readview 什么时候创建,由什么组成
事务开启后,第一次执行select查询操作就会创建一致性视图read-view,由执行查询时所有未完成的事务组成的事务id数组,以及已创建的最大事务id组成
2、 事务可见性的比较法则
如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;
如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的trx_id 就是当前自己的事务是可见的);
如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的
事务是可见的);
b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。
3、undolog版本链
4、当前读 和 快照读 是什么
在RR(可重复读隔离级别)下,当事务执行第一条select语句的时候就会查找出当前最新的数据生成一个快照,那么在当前事务中不管其他事务是否对该表做了多少操作,当前事务查询到的数据都是这个快照,直到当前事务对表中的数据进行修改之后,再次查询这些被修改的数据就会是当前最新的数据,但其他未执行修改操作的数据,查询之后依然是快照中的数据
也就是说select查询到的都是快照读
update/insert/delete操作之后,对应被修改的数据都是当前读