本篇内容主要讲解“什么是MVCC机制”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是MVCC机制”吧!
我们上篇讲解了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机制”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。