MVCC简单易懂总结(如何实现读已提交,如何实现可重复读,幻读是什么)

网上说MVCC定义也有很多,有的好像对,有的却可以自己推出反例,那么我们从实验结果出发和源码去探讨一下什么是MVCC,内容简单请大家耐心看看

首先隔离级别这个相信大家都知道了,MVCC主要作用于读已提交和可重复读。为什么呢?
1.因为读未提交是什么隔离都不做,那就是啥都不干那就不用咯。
2.串行化都一个一个来哪还有什么并发。

前提是innodb的存储引擎,本文只适用于innodb

然后我们来了解一下mysql中的3个隐藏属性

首先隐藏属性1
备用主键,当你的表没有设置主键时那么就会启用备用主键,主要用于主键索引(个人理解,错误请大家指出谢谢大家)。

隐藏属性2(mvcc关键点)
最后一次操作该数据的事务的id(每次创建事务都会根据最新的事务的标识符+1)

隐藏属性3
用于回滚的指针

首先我们先解决第一个问题,mysql如何实现读已提交。

在读已提交的隔离级别下,每一次操作(注意是每一次操作)都会生成一个当前活跃的事务的id的集合数组,称为read view。
读已提交读取的数据:
1.事务id不在活跃事务数组(read view)
2.事务id是自己本身事务的数据

name 事务id 回滚指针
小明 3 暂时先不管了

当前的事务的id为4 活跃事务数据[4] 那么是可以查到这一条数据的
那么这个时候开始事务5,他修改了这一条数据
修改后的数据

name 事务id 回滚指针
小明 3 暂时先不管了
新小明 5 上面那条

在事务4查询的时候会再次生成一个read view即活跃的事务数组[4,5]那么事务4是无法查询到这一条数据的,那么他之后根据指针往回走 找到上面这一条事务id为 3 的数据 那么他就可以 返回该结果了
注意:此时事务5并没有提交
然后事务5提交了之后又会怎么样呢
事务4再次查询&

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值