MVCC:多版本并发控制。
隐藏字段
主要字段就是:
1.trx_id:当前事务id。
2.roll_pointer:指向上上一版本的地址,配合undo log生成版本链表。
undo log
undo log就是用于存储回滚日志的文件,就是存储我们每个版本的信息,通过roll_pointer生成一个版本链表。
ReadView
在ReadView中的重要字段:
m_ids:当前活跃的事务id的集合。
min_trx_id:当前最小的活跃事务的id。
max_trx_id:当前最大的活跃事务的id。
creator_id:当前创建ReadView的事务的id。
例子:
此时我们就可以计算出对应的字段的值。通过版本链计及对应的选取规则来算出对应的版本。
版本链数据访问规则:
trx_id:当前版本的事务id。
1.trx_id == creator_id。(判断当前的事务ids是否为创建ReadView的事务id)
2.trx_id < min_trx_id。 (判断当前的事务id是否小于最小的活跃的事务id,如果成立就是说明此版本的是=事务已经提交)
3.trx_id > max_tra_id。(判断当前的事务id是否在创建ReadView之后创建的,如果是的话则不复合条件)
4.min_trx_id <= trx_id <= max_trx_id 并且不包含在活跃的事务id集合中。(表示该事务已经提交)
按照当前的事务id和版本链数据的访问规则就可以确定对应的版本。
不同的隔离级别对应的版本的结果是不一样的。
读已提交:在每次读取查询数据的时候就会创建一个新的ReadView。(所以在每次读取数据的时候结果是不一样的)
可重复读:只在第一次查询数据的时候才会创建ReadView,后续的查询都是使用该ReadView的复制。(所以在每次读取数据的时候结果是一样的)
回答话术
在MVCC中主要分三个部分:隐藏字段,undo log, ReadView。
隐藏字段中主要是:trx_id(当前的事务id),roll_pointer(指向上一版本的地址,配合undo log生成版本链)
undo log :回滚日志,用于存储每个版本的信息。通过roll_pointer生成版本链。
ReadView:通过事务id和对应的版本链数据访问规则确定对应的版本信息。
不同的隔离级别的版本结果是不一样的,因为在读已提交时每次查询数据的时候都会创建新的ReadView,在可重复读时只有第一次才会创建ReadView,获取的查询操作都是使用该ReadView的复制。