温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

什么是MVCC机制

发布时间:2021-10-14 10:09:53 来源:亿速云 阅读:314 作者:iii 栏目:编程语言

本篇内容主要讲解“什么是MVCC机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是MVCC机制”吧!

1,undo log 版本链回顾

我们上篇讲解了undo log版本链是怎样的《MYSQl深入探索系列二 undo log》咱们在来看下那张图

什么是MVCC机制

2,什么是readview

我们不是说mvcc吗?怎么又出现个readview呢,这俩有什么关联么?

别着急,听我慢慢道来咱们还是简单画个图,看下这readview是个什么东西和mvcc是什么关系

什么是MVCC机制

通过上图可以基本上分清楚他们3个之间的关系了吧 readview中主要就这4个东西

  • min_txr_id: 当前readview中最小的事务id

  • max_txr_id:当前readview中最大的事务id

  • creator_txr_id:本次readview的事务id

  • [xx,xx,xx]:当前活跃的事务id数组

这几个值究竟有什么用呢?比如说 当前的readview min_txr_id: 20 max_txr_id: 30  creator_txr_id:20  [20,30]  那么这个readview就是 事务20创建的,此时undo 版本链有 3个 分别对应txr_id 19  22  29 哪改事务就只能读取txr_id为19的那个版本,其他2个版本是读取不到的。

3,事务的隔离级别以及每种隔离级别带来的问题

我们都知道有4中事务隔离级别

  • read uncommited: 读为提交,即可以读取到其他事务没有提交数据 以下我简称 ru

  • read committed: 读提交,即只有其他事务提交后才可以被当前事务读取到 以下我简称 rc

  • repeatable read:可重复读,单次事务可以多次读取到相同的值 以下我简称 rr

  • serializable :  串行化,所以事务排队依次执行,不存在并发情况,性能最差

这几种隔离级别常见的问题是什么呢?

     ru 情景一 :有 A B 两个事务同时来操作同一条数据,A呢更新了这条数据值为a但是还没提交,此时B读取到了a,但是事务A某种原因回滚了,导致事务B再也读取不到a了这就是 脏读。

          情景二 :有AB两个事务同时来更新统一条数据c,事务A呢将c更新成了a 还没提交,此时事务b过来更新把a更新长b 然后提交了。但是事A回滚了,导致事务B就蒙蔽了命名更新成b了现在变成c了,这就是 脏写

     rc  情景一 :有2个事务AB在同时运行,事务A 按照制定条件查询了符合条件的行数 6条,select count(1) from xxx where age>18,此时事B插入了2条数据并且提交了事务,事务A再次查询发现符合的条数变成8条了,好奇怪啊 2次查询同样的条件居然查到的条数不一样,这就是 幻读

           请景二 :有2个事务AB在同时操作同一条数据c,事务查询c值完成一些业务操作,此时事务A将数据c值更新成了a并且提交了,但是事务B再次查询这条数据发现值不一样了?同一个事务内多次读取到的同一条数据值不同,这就是不可重复读

     rr  这个虽然解决了可重复读的问题,即一次事务中无论该条数据被其他事务更新了多少次,始终读取到的都是同一个值,但是仍然有幻读的问题

4,mysql中是如何支持read committed的

mysql中是如何通过mvcc 支持read committed呢,如果我们在mysql中设置的隔离级别是 rc 哪每次查询都会生成一个新的readview,这是实现rc的关键,我们举例看下

还是A(id=20)、B(id=30)两个事务同时来操作数据c,事务A第一次查询的时候生成readview 1 min_txr_id=20 ,max_txr_id=30,活跃事务[20,30],creator_txr_id=20  对应的undo log版本是txr_id=19  旧值是c。

此时事务B将c更新为b并且提交了,生成了undo log txr_id=30的版本,事务A再次发起查询生成新的readview 2 min_txr_id=20,max_txr_id=31,活跃事务[20],creator_txr_id=20。

发现活跃的事务只有它自己了,然后顺着undo log版本链查到到txr_id=30这条,虽然它的事务id比自己大,但是活跃事务中并没有它,说明事务30已经提交了,所以此时可以看到该版本,所以事务A第二次读取的c值为b。

5,mysql中是如何支持repeatble read的

我们来看下mysql怎么通过mvcc 实现rr可以同时解决不可重复读,幻想读的2中问题的。

如果我们将mysql设置rr隔离级别,每次事务只会生成一个readview,不管当前事务查询数据库多少次。

如果每次事务读取的readview相同也就是每次能看到的undo log版本相同,所以每次看到的数据也就相同,即可解决可重复读、幻想读的问题。

到此,相信大家对“什么是MVCC机制”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI