关键字:
KingbaseES、MVCC、数据快照、快照过期、人大金仓
1、MVCC的应用
1.1、事务隔离与可见规则
MVCC的引入导致数据经常处于多事务同时处理的状态,这时就需要事务隔离级别的规定来保证事务间的互不干扰与可见性界定
RC(Read Committed),读写时只有committed的数据能被操作,但是会引入不可重复读;
RR(Repeatable Read),读写时即使已committed,但是事务ID还在版本链区间,也不可操作,确保数据一致性读。
可见性规则举例:
①数据记录的事务ID<最小事务ID时,表示该数据版本已提交,可以被读取;
②数据记录的事务ID在最小事务ID和最大事务ID之间,且>cmin_id时,表示该版本对应的事务未提交,不可见;
③数据记录的事务ID在最小事务ID和最大事务ID之间,且<cmin_id时,表示该版本对应的事务已提交,可见;
④数据记录的事务ID>最大事务ID时,表示该数据版本该视图生成后创建,不可见;
1.2、读操作(select)执行过程
1)获取事务指定的数据快照:开始执行select事务时,生成一个数据快照,以确定当前数据版本的状态;
2)查询可见的数据版本:基于数据快照,检查每个被查询的数据行的版本链,并根据DB的可见性规则确定每个数据行当前状态为可见的数据版本;
3)展示被读取到的信息:根据上一步查询的结果,生成需要放回的视图信息;
1.3、写操作(insert、update、delete)执行过程
1)开始事物:写操作事务开始时,获取唯一的事务ID(xmin_id),并记录当前的数据快照;
2)生成数据版本:写操作在未被提交前,不会直接操作相关数据表,而是在undo log中创建一个数据版本;
3)更新版本链:将新生成的版本插入到对应的版本链的链头,成为版本链中最新的数据版本;
4)事物提交:事务在提交后,更新为最新的可见版本。
1.4、其他
1.4.1、MVCC与不可重复读
不可重复读:当事务A对数据进行读取后(未提交),该数据被被另一个事务修改(已提交),事务A再次对数据进行读取,获取结果为修改后的数据。
MVCC处理机制:针对同一事务的第一次查询会获取数据快照,该事物后续的查询都基于该快照去判断,这样每次查询的结果都在同一版本链的可见数据版本内,从而解决不可重复读的问题。
1.4.2、MVCC与幻读
幻读:当事务A对数据进行读取后(未提交),该数据被被另一个事务修改(未提交),事务A再次对数据进行读取,获取结果为修改后的数据
幻读的问题是无法通过MVCC单独解决,但是通过使用范围锁(range locking)去锁定一定范围的数据,以便确保其他事务不能再范围内进行数据操作。因为指定事务能够锁定整个范围锁内全部数据,从而保持了数据的一致性。