1. 什么是MVCC

口述:MVCC其实他是解决这种读-写的情况的,当然读-写也可以用 锁来实现,MVCC实现的话更加高效,用锁的话其实就是相当于串行执行,读完才能写或者写完才能读。那MVCC其实可以读写并存,就解决了读以提交和不可重复读的问题其实MVCC在读的时候生成readView这里的话其实对应不同隔离级别生成策略也是不同的,其实也是为了解决这个可不可以重复读和幻读问题的,要是在读已提交隔离级别下那么只要select就会生成readview,也正是因为这样,可能导致幻读,在可重复隔离级别下,一个事务select只会生成一个select,所以这个时候只有第一个select生成readviewreadview里面记录当前活跃的事务id,那我之后再查询事务也是以这个readview里面的活跃事务id参考然后再到undo log中去找,即使可能这个一次到第二次的期间内有属于这个活跃事务表中事务进行了提交,但我认为你还是没有提交的,因为我的这个readview是根据第一次select生成的,所以我在undo log 中一查,哎你的事务id在我的活跃列表中,你的操作可能会影响到我,我不读你,我再读当前undo log的前一个undo log,我再去判断,直到找到比这个活跃列表中的事务id小的那一条记录,正因为这样,也就解决了幻读,不管一个事务有多少select,我select到的和一个select的是一样的,不会存在select发现怎么多了几行记录的情况。
当前事务根据readView里面信息去这条记录回滚指针里面去找undo log,读到历史版本其实这里的话就是比如select语句执行时,innodb会将这个时刻系统中活跃的事务id记录到redaview中,因为当前读而这个时刻活跃的事务可能会影响自己,我正在读而你在修改还没提交,就会造成我的不可重复读和幻读,所以我吧这些东西记录在readview中,由readview记录的信息再去undo log中找属于我这个事务的历史版本

2. 快照读和当前

读取的是快照数据。 不加锁简单的 SELECT 都属于快照读 ,即不加锁的非阻塞读,快照读的实现基于MVCC
数据进行增删改都会进行当前读,都会加锁

3. 复习

在MySQL中,默认隔离级别是可重复读,就可以解决幻读问题使用的就是MVCC,
也是乐观锁体现。
隐藏字段、Undo Log版本链:

4. MVCC实现原理之ReadView

MVCC 的实现依赖于隐藏字段、Undo Log、Read View 。

Read View
如果一个事务想要查询这个行记录,需要读取哪个版本的行记录呢?这时就需要用到ReadView了

ReadView中的内容

ReadView的规则
口述其实就是判断undo log中记录的每个行记录的事务id是不是满足条件,就是undo log 中行的事务id要小于readView中记录的活动事务的范围,小于的话那其实表示了 我select时候你这条记录以及commit了,因为活跃的事务就是记录当前select时候系统中还有哪些事务在执行但是没有commit,那些事务就可能会影响自己,所以吧它们记录下来,根据比较规则从undo log中拿到版本记录。

5. 总结

MVCC是处理这种读-写写-读情况下的一种方案
只在READ COMMITTD、REPEATABLE READ情况下

READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是生成ReadView的时机不同

说明: 我们之前说执行DELETE语句或者更新主键的UPDATE语句并不会立即把对应的记录完全从页面删除,而是执行一个所谓的delete mark操作,相当于只是对记录打上了一个删除标志位,这主要就是为MVCc服务的。因为可能要回滚,不能直接删除


通过MVCC我们可以解决:

  1. 读写之间阻塞问题通过MVCC可以让读写互相不阻塞,即读不阻塞写,写不阻塞读,这样就可以提升事 务并发处理能力。

  2. 降低了死锁概率。这是因为MVCC采用乐观方式读取数据时并不需要加锁,对于写操作,也只锁 定必要的行。

  3. 解决快照读问题。当我们查询数据库在某个时间点的快照时,只能看到这个时间点之前事务提交更新结果,而不能看到这个时间点之后事务提交更新结果

原文地址:https://blog.csdn.net/qq_51240148/article/details/134751028

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_30082.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注