什么是MVCC?

多版本并发控制MVCC 是一种 并发控制的方法,一般在 数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。 读取数据时通过⼀种类似 快照 的⽅式将数据保存下来,这样读锁就和写锁不冲突了,不同的事务session会看到⾃⼰特定版本的数据,版本链

MVCC只在 READ COMMITTEDREPEATABLE READ 两个隔离级别下⼯作。其他两个隔离级别够和MVCC不兼容, 因为 READ UNCOMMITTED 总是读取最新的数据⾏, ⽽不是符合当前事务版本的数据⾏。⽽ SERIALIZABLE 则会对所有读取的⾏都加锁。

聚簇索引记录中有两个必要的隐藏列:


trx_id :⽤来存储每次对某条聚簇索引记录进⾏修改的时候的事务id。

roll_pointer :每次对哪条聚簇索引记录有修改的时候,都会把⽼版本写⼊undo⽇志中。这个
roll_pointer就是存了⼀个指针,它指向这条聚簇索引记录的上⼀个版本的位置,通过它来获得上⼀个版本的记录信息。(注意插⼊操作的undo⽇志没有这个属性,因为它没有⽼版本)

已提交读和可重复读的区别就在于它们⽣成ReadView的策略不同。

开始事务时创建readview,readView维护当前活动的事务id,即未提交的事务id,排序⽣成⼀个数组


访问数据,获取数据中的事务id(获取的是事务id最⼤的记录),对⽐readview:


如果在readview的左边(⽐readview都⼩),可以访问(在左边意味着该事务已经提交)


如果在readview的右边(⽐readview都⼤)或者就在readview中,不可以访问,获取roll_pointer,取上⼀版本重新对⽐(在右边意味着,该事务在readview⽣成之后出现,在readview中意味着该事务还未提交)


已提交读隔离级别下的事务在每次查询的开始都会⽣成⼀个独⽴的ReadView,⽽可重复读隔离级别则在第⼀次读的时候⽣成⼀个ReadView,之后的读都复⽤之前的ReadView。


这就是Mysql的MVCC,通过版本链实现多版本,可并发读-写写-读。通过ReadView⽣成策略的不同实现不同的隔离级别。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图图是个好孩纸~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值