MySQL之MVCC


一、什么是MVCC?

mvcc只有在READ COMMITTD和REPEATABLE READ这两种隔离级别的事务下才有效。
MVCC是通过数据行的多个版本管理来实现数据库的并发控制,使得innoDB的事务隔离级别下执行一致性读操作有了保证。
就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。

二、快照读与当前读

①快照读
快照读又叫一致性读,读取的是快照数据。不加锁的简单的select都属于快照读,即不加锁的非阻塞读。
快照读的实现是基于mvcc,他读到的数据并不一定是数据的最新版本,而有可能是之前的历史版本。
②当前读
当前读读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对记录进行加锁。

三.MVCC实现原理之ReadView

mvcc的实现依赖于:隐藏字段,Undo Log,Read View
在mvcc机制中,多个事务对同一个记录进行更新会产生多个历史快照,这些快照保存在Undo Log里。ReadView就是事务在使用MVCC机制进行快照读操作时产生的读视图。当事务启动时,就会生成数据库系统当前的一个快照。

mvcc整体操作具体流程

①首先获取事务自己的版本号,也就是事务ID;
②获取ReadView;
③查询得到的数据,然后与ReadView中的事务版本号进行比较;
④如果不符合ReadView规则,就需要从Undo Log获取历史快照;
⑤最后返回符合规则的数据
在隔离级别为读已提交时,一个事务中的每一次SELECT查询都会重新获取一次Read View。
当隔离级别为可重复读时,就避免了不可重复读,这是因为一个事务只在第一次SELECT的时候就会获取一次ReadView,而后面所有的SELECT都会复用整个Read View。

四. MVCC可以解决的问题

①读写之间阻塞的问题。通过MVCC可以让读写互相不阻塞,这样可以提高事务的并发能力。
②降低死锁的概率。因为MVCC采取了乐观锁的方式,读取数据不需要加锁,对于写操作,也只锁定必要的行。
③解决快照读的问题。当我们查询数据库在某个时间节点的快照时,只能看到这个时间点之前事务的结果。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值