图14中的版本链数据
其实就是快照数据 记录了历史每个事务对于这条数据的变更记录 并非每个事务都复制了一份这条数据
快照数据是针对于全库全表的
举例说明 调整下时序图
在查询事务2上添加了步骤8 select * from t; 查询t表 此时就会生成一个readview 那么第15步就会使用这个readview去版本链中比对查询数据
所以任何一个查询事务(session级别的)sql语句生成的readview 是针对全库所有表的快照 在当前事务 查询所有表都会沿用这个readview
删除数据
对于删除的情况可以认为是update的特殊情况 会将版本链上最新的数据复制一份
这是最原始的一条数据 如果将之删除 首先会复制这一条数据 比如删除的事务id是300
接下来会在复制的这条数据的信息头的标记位写上ture
表明这条记录虽然在版本链中但已经被删除了 再来查询的话 按照刚才说的readview和版本链的比对规则找到了是这条记录 会判断下这条记录头信息中的标记位是否为ture 如果为ture的话 则不会返回 如果这条记录没有任何标记 那么就是符合的 就会返回这条数据