十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
本篇内容主要讲解“什么是MVCC机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是MVCC机制”吧!
坚守“ 做人真诚 · 做事靠谱 · 口碑至上 · 高效敬业 ”的价值观,专业网站建设服务10余年为成都成都发电机租赁小微创业公司专业提供企业网站制作营销网站建设商城网站建设手机网站建设小程序网站建设网站改版,从内容策划、视觉设计、底层架构、网页布局、功能开发迭代于一体的高端网站建设服务。
我们上篇讲解了undo log版本链是怎样的《MySQL深入探索系列二 undo log》咱们在来看下那张图
我们不是说mvcc吗?怎么又出现个readview呢,这俩有什么关联么?
别着急,听我慢慢道来咱们还是简单画个图,看下这readview是个什么东西和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个版本是读取不到的。
我们都知道有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 这个虽然解决了可重复读的问题,即一次事务中无论该条数据被其他事务更新了多少次,始终读取到的都是同一个值,但是仍然有幻读的问题
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。
我们来看下mysql怎么通过mvcc 实现rr可以同时解决不可重复读,幻想读的2中问题的。
如果我们将mysql设置rr隔离级别,每次事务只会生成一个readview,不管当前事务查询数据库多少次。
如果每次事务读取的readview相同也就是每次能看到的undo log版本相同,所以每次看到的数据也就相同,即可解决可重复读、幻想读的问题。
到此,相信大家对“什么是MVCC机制”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!