mvcc是一种通过记录和遍历undolog来实现非阻塞读写并发的多版本并发控制机制。
查询数据快照读的时候会生产一个read_view,保存了当前事务id(creator_trx_id),活跃事务id列表(trx_ids_list),最小事务id(min_trx_id),下一个事务id(max_trx_id,最大活跃id+1)
版本数据和当前数据都有隐藏列:当前版本事务id(trx_id),主键id(row_id),回滚指针(roll_prt),每个版本指针相连
每次更新的时候都会写一个undo_log版本记录,读取数据的时候通过遍历版本链的版本号去匹配read_view找到正确的当前版本,当版本链的事务id小于最小事务id,或者等于当前事务id的时候,读取出来返回数据。
可重复读:read_view第一次读创建一次,都是一样的,不管提交与否
读已提交:每次读都会创建一个新的read_view,每次都不一样,所以能读取到已经提交的数据