关键字:
KingbaseES、MVCC、数据快照、快照过期、人大金仓
1、实现方式
1.1、核心组件
MVCC的核心组件包括:版本链(Version Chain)、trx_id(即,事务id)、可见性规则(Visibility Rules)、数据版本、可回滚段。
版本链:每个变更数据的事务操作对象,不是原始数据,而是为该事务创建的数据版本,复数个有关联的数据版本就会产生一个链接于该原始数据行的链表;
版本链简图
事务ID:标识事务的唯一标识符,具有全局唯一性,事务提交后递增,可用来跟踪每个事务的操作;
数据版本/数据快照:每一个更新数据的事务启动时,在DB中的数据都有与之对应的状态记录拷贝(事务的操作也是针对这个记录,而不是针对原始数据),以便确定数据拷贝对该事务是否可见,从而实现事务间的数据隔离;
可见性规则:DB用于决定哪些版本对于特定事务是可见的判定规则;
可回滚段(undo log):为了支持事务的回滚操作,DB提出了可回滚段这个概念。当一个事务需要回滚时,根据undo log中的记录,撤销事务对应修改,使数据恢复到事务发生前的状态。 在版本链中,回滚操作依赖回滚指针(roll_pt)和rwo_id来实现;
rwo_id(索引id):数据版本的隐藏列,产生聚集索引树,与更新一个数据版本的回滚指针对应。
回滚指针(roll_pt):数据版本中的隐藏列,用以标识出回滚动作的旧数据版本的rwo_id。
在执行更改数据操作时,每次操作都将在undo log中生成一条详细记录,其中包含着全局唯一的roll_pointer,用以指出这条记录有关联关系的前一条undo-log记录。一条数据的多个undo-log记录通过roll_pointer就可以形成针对该数据的版本链,当有事务对该数据进行操作时,将操作记录连接到版本链的头部。
MVCC版本链及数据版本结构
1.2、MVCC中的事务ID
当一个版本链生成时,会创建一个读视图,包括整个版本链涉及的所有数据版本的事务ID可调用的最小事务ID(min_trx_id)、最大事务ID(max_trx_id)、
xmin_id:数据的insert操作发生时,占用的事务ID;
xmax_id:数据的delete操作发生时,占用的事务ID,未执行删除操作时为0,删除数据的事务发生时,变更为非0数组;
cmin_id:更新数据元组的操作在insert事务中的标识符;
cmax_id:放弃数据元组的操作在insert事务中的标识符;