MVCC的理解

读已提交和可重复读级别是基于MVCC来控制的。

MVCC即Mutil-Version Concurrency Control(多版本并发控制),用于保证并发快照读下的读已提交级别和可重复读级别。

一、快照读和当前读

1.快照读:即普通的select语句
例如:select * from student
2.当前读:
insert update delete
select … for update
select …lock in share mode

二、基于ubdo_log(回滚日志)的版本链

在每一行数据里有两个隐藏字段 :
1.trx_id 当前事务id
2.db_roll_ptr 指向上一个版本的指针
在这里插入图片描述

三、readview

readview是快照读时,提取哪一个数据版本的依据

  • m_ids :当前未提交的事务编号集合
  • min_trx_id:未提交的事务的集合里最小的事务编号
  • max_trx_id:预分配事务编号
  • creator_trx_id:创建者的事务编号

将每个版本的数据的事务id依次代入到判断规则当中来决定选取哪个版本的数据
判断规则:
在这里插入图片描述
1.首先判断数据的事务idreadview的制造事务id是否相等,等于则读取成功,不等于进入下一步
2.判断数据的事务id是否小于最小的未提交的事务的id,小于则表明这个数据已被提交,可以被访问,
3.判断数据的事务id是否大于预分配事务id,如果大于则表明这个数据还没提交,不可以访问
4.判断数据的事务id是否在未提交的事务集合里,如果不在,则表明已经提交,可以访问
5.若最终判断出这个数据不可以被访问,则通过指针找到上一个版本的数据,进行循环判断

在读已提交级别,每进行一次快照读都会生成一个readview,
在可重复读级别,每进行一次快照读都是同一个readview,以此来保证在同一个事务中,快照读到的数据是一致

在不可重复读的级别下,innodb不仅可以避免不可重复读,还可以避免幻读(不能完全避免)。
但是注意: 在两次快照读之中加入当前读会造成幻读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值