MVCC原理

MVCC原理(multi-version-concurrent-control 针对读已提交、可重复读这两种隔离级别读写的操作,如果是读未提交,每次查询都取最新记录即可) - undo log

mysql底层会给每张表加trx_id(事务ID字段),roll_pointer(回滚指针)字段

事务ID字段:当插入一条数据的时候,会把当前事务ID写到这条记录上去(增删改才会生成事务ID)

在这里插入图片描述

在这里插入图片描述

每次查询的时候会读取出read-view:[未提交事务id]数组+最大事务id,并根据readview从undo log日志中最新的记录依次往下找

读已提交隔离级别的情况:

如上图事务4,当执行select name from table where id = 1,会自动生成 read-view:[1,3]3 ,[]里的数据表示[min_id,max_id]

当select的时候会 根据read-view从undo log日志中最新数据依次往下找,

1、当找到第一条数据的时候事务id为1(trx_id),会先看trx_id:1 是否比[1,3]中的min_id小,如果小的话是可读的,

2、然后还会看trx_id:1 是否比[1,3]中的max_id 大,如果比它大的话,那它就是在read_view生成之后,新生成的一条记录,是不可读的状态,

3、接着看这个trx_id既不比min_id小 也不比 max_id 大,那么就看是否在未提交的数据列表[1,3]中,如果在的话,证明当前是未提交的事务,是不可读的状态。

4、那么接着顺着roll_pointer回滚指针往下找,找到第二条记录trx_id:3,这个3在未提交的数组链表read-view:[1,3]3中,那么证明也是未提交的事务,也是不可读的状态。

5、接着顺着这个roll_pointer往下找,找到trx_id:2的,判断2 不比min_id小,也不比max_id大,再看是否在未提交的数组链表read-view:[1,3]3中,2不在链表中,证明是已提交的事务,那么是可读状态。所以第一个select语句查询后返回的结果是 name:B 的那条数据。

可重复读隔离级别情况:

和读已提交唯一的区别是:读已提交每次查询的时候都会生成一个read-view

可重复读:第一次查询的时候生成一个read-view,后面再查询的时候会复用第一次生成的read-view来进行undo log按规则读

版本链对比规则:(每次查找都从undo log日志中按最新记录找)

1、当trx_id<min_id,表示这个是已提交的事务,是可读的

2、当trx_id>max_id,表示这个是由将来启动的事务生成的,是不可读的状态

3、当 min_id <= trx_id <= max_id,包含两种情况

a)、当trx_id不在[min_id,max_id]数组列表中,那么是已提交的事务,可读

b)、当trx_id在[min_id,max_id]数组列表中,那么是未提交的事务,不可读状态

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值