innodb 通过B+树作为索引的数据结构,而主键所在的索引又称为聚蔟索引。聚簇索引是指索引和数据存放在同一个结构中。
其他的索引这是 索引中的叶子节点存放的是聚蔟索引叶子节点的键值。所以二级索引维护变的方便.
在Innodb主键索引结构叶子节点中, 除了RowId外, 还有trx_id : 表示最近修改的事务id.
db_roll_ptr:undo segment中undo log , 上一个版本数据在undo log 里的位置指针。
【1】 ReadView 策略
up_limit_id: 创建当前read view 时, 当前系统活跃事务最小版本号.
low_limit_id: 创建当前read view 时 当前系统活跃的事务最大版本号.
trx_ids : 当前系统活跃(未提交) 事务版本号集合. 我的理解是它是 创建当前read view 时所有活跃事务版本号集合。
creator_trx_id: 创建当前read view 的事务版本号;
Read View 匹配规则:
a. 数据事务ID 小于 up_limit_id 则显示
说明数据是在所有所有活跃事务之前创建, 可以显示.
b. 数据事务ID 大于 low_limit_id 则不显示
事务3 开启事务,目前只有这个活跃事务,则up_limit_id = low_limit_Id = 3.
如果数据事务ID 大于 low_limit_id, 表示是之后的事务创建的数据,不显示
c. 数据事务ID 大于等于 up_limit_id 并且 小于等于 low_limit_id
处于这个区间之间的 事务,在当前事务开始时有可能提交,有可能还没有提交。
当前数据事务ID 不存在活跃事务ID集合 或 等于creator_trx_id, 则显示
d. 不满足read view 条件时, 从undo log里面获取。 从 undo log 取到数据的历史版本, 直到符合read view 条件或者找不到返回空.
[2] undo log的理解
每一行数据都会有 db_roll_ptr 指针, 每一版本的数据行 形成一个链表,链表头部是最新版本数据。
db_roll_ptr 是上一个版本数据行的索引。 这里用于 Read View 匹配规则的第D条。
[3] 数据的trx_id
它总是等于操作它的事务ID