MVCC详解(小白也看得懂)

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的复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值