00:00
好,下面呢,我们来看一下这个MVCCC啊,是如何来解决这个患读的问题的啊,那既然提到这个读的并发问题了,那我们说呀,是不是一定得是得是在这个叫repeatable这个隔离级别下呢去讲啊,对吧?诶这个大家得清楚,所以我们下边演示的时候呢,一个大前提得是repeatable read这样的一个隔离级别。好,那么首先的话呢,我们这个表里边呢,有一条数据啊,这呢我是把这个数据的一个简要的一个情况呢,就罗列到这儿了啊,然后呢,我们诶最近的一次对这个数据呢,进行修改的这个事物啊是十啊是这个十啊,ID呢是一的这样一条记录啊没问题,然后呢,接下来我们去做这个分析,首先的话呢,你得先还记得什么叫换读啊啊这个我们先描述一下这个问题,比如说我们现在有两个事物啊,一个叫事物A啊,它的ID呢是20,还有一个呢叫事物B,它的ID呢是30。现在呢,我们这个ID啊,这个15A呢,ID为20的这个数据呢,它现在做一个查询啊,比如说呢,我们就执行这样的一个查询语句。说呢V尔ID呢大于等于一,假设呢,我们这个表里边呢,就只有这一条记录,那ID呢,这时我们去查的时候呢,呃前面你这个15ID10的都已经提交过了啊,所以这时候我们去查的话呢,就会把这条记录呢给查出来啊,这没问题是吧?然后呢,此时呢,我们这个事务你注意他没有结束啊,在没有结束的情况下呢,我们这个事务B啊就ID为30呢,它呢,诶来了两条新添加的数据啊,这个ID的话呢,都比这个一呢要大。
01:23
那新添加两条数据之后呢,诶我们这个示威呢,再去查,诶发现呢,这个表里边呢,多了两条记录,那这呢是不是就叫做换读问题,那我们现在说能解决换读问题,那杨IG呢,就是我们这时候呢,在你插入两条记录之后呢,A再去查呢,还是只有这一条记录,那就相当于我们就解决了这个换读问题了。啊,是这个意思吧,啊,我们下边看一下如何去保证啊,应该说呢,我讲到这儿呢,呃,这个前面呢很清楚的同学,这个呢,其实可能都不用我讲,大家就已经会很清楚了啊好,那下面的话呢,我们在这个15A里边呢,咱们做一个查询,那我一旦呢执行查询,哎,注意这也是我首次呢去执行查询,那我们就会呢生成一个。
02:01
对吧?诶首次呢是生成个,因为我们在这个诶可重复读的这个隔离级别呢,它只用第一次的这个查询的啊,那这时候我们生成这呢,这个内容是什么样子呢?此时呢,我们有两个啊这个活跃的这个事物是不是一个是20,一个是30啊这个呢是20,这个呢就是30加个一,然后这个呢是诶我们20呢,这个呃事物呢,在查询的时候呢,帮我们生成的review,所以这呢就是20,这都没问题是吧?好那么接下来的话呢,我们执行这样语句的话呢,咱们,呃事实上呢,从这个表里边呢,应该就查到这一个,但关键这个呢,能不能查出来,这个不一定我们需要呢做这个判断啊,那我们就看到了这里边的这个15ID呢,是不是十啊。这个事YD是十,它呢,是不是比我们这里边儿这个小的还小。啊,那这里边是活跃的啊,你比这个小的还小,那说明呢,你之前都已经执行过了,而且呢,还提交了啊,因为你没活跃嘛,啊那就意味着呢,他已经提交了啊没活跃诶我们就会把这条记录呢给查出来,诶目前这个表里边呢,也只有这一条记录,所以说呢,我们第一次做这个查询操作的时候呢,就把它给查出来了啊这没有问题,然后紧接着啊,在我们这个事务呢,A没有结束的情况下呢,我们这个事务B呢往里边诶我们insert了两条记录,那现在呢,是不是就有这样的三条记录了,那我们要是执行一个查询操作,还是执行这个查询操作啊呃,理论上来讲的话呢,我们其实能看到这,呃能能能找到这三条记录,但关键是这三条记录呢,都能不能查出来,我们需要呢,一个一个的做判断。
03:23
那么这个时候的话呢,诶,我们这条记录呢,刚才已经说过了啊,肯定是能看得到的,关键呢,就是这两条记录,这两条记录的话呢,你看ID是30啊,注意我们再去做这个。Select查询的时候呢,我们由于是在这个able这样的一个隔离级别下啊,你要是在上面这隔离级别呢,那相当于呢解决不了啊,在这个隔离级别下呢,我们说只会诶是不是第一次查询的时候呢,生成的这review view我们还会用啊啊那这个时候呢,意味着我们还是得看这儿啊,那你要再看这儿的话呢,在我们这个信息里边啊,咱们能够看到是不是认为你这个30还是一个活跃的一个情况。是吧,还是个活跃的情况,那你这块呢,你这有30,那相当于你还在这里边儿,那大家问你说我们这时呢,要不要用这个数据啊,是不是显然就不能够用啊,诶那我们就不应该把它再读出来,那既然不能读出来,那是不是就只能读这一条,那杨IG呢,我们再去做一个select同样的这个语句的时候呢,就没有把那你后插入的这条记录呢,给它读出来了,哎,那就是不是就不会产生我们这个换堵的问题了。
04:23
对吧,哎,就不会产生我们这个换读问题,就不能够看到了啊,那你要是在这个呃,读已提交的这样一个隔离级别下呢,那是不是就意味着呢,你相当于我们,诶是不是要重新的生成一个read了。对吧,哎,重新生成一个了啊,那就不一样了啊,重新生成,然后呢,你这个添加完以后的话呢,你自己呢,比如说给提交了,那就没有这个30了,那这对应的这两个数据呢,不就能看得到了。啊,就这样个场景啊,这个注意行,那这呢我们就说清楚了,这个repeat这个隔离级别下呢,我们就把这个换问题啊,诶就给解决了啊行,那这块呢,说完之后呢,整个呢,我们这个MVC啊,其实咱们就解释的就比较透彻了啊最后呢,做一个小结啊,大家需要呢,落地呢,掌握这么几个事儿啊嗯,简单来说的话呢,MCC首先明确一下,只有在这两个隔离级别下呢,它才有效。
05:11
因为只有这两个隔离级别下呢,我们读的时候呢,才会考虑是快照了,剩下的一个是读未提交,一个是串行化,其实都可以理解成呢,是读的是最新的数据了啊,所以呢,我们就不会用到这个MVC,然后呢,整体上来说呢,MVCC呢,针对的就是我们哎,咱们在上一章提到的这个哎处理这个读写写读这种问题的情况下的一种处理方案。啊,因为呢,还有一种方案呢,就是读跟写的加锁,而我们现在呢,选择的是这个m macc这种方式啊,读这种快照的数据,那其实我们可以提高这种并发性是吧,这个呢,你清楚呢,我们这里边说的这个事儿啊,提高这个并发性。好,然后的话呢,针对我们这个read committed啊,说每一次呢select都会生成,而这个呢,只会在第一次select时候生啊,后边呢都复用,这个咱们都已经强调过了,诶正因为有这样个特点,它才保证了这个叫不可重复读和换读问题的解决啊这个说清楚了啊,这块呢,就插入一个小知识点,就是前面呢我们说过这个delete,说delete的时候呢,我们其实并没有真正意义上去删除这个数据,而只是呢,把这个行格式里边的个delete mark呢,是不是记录从零改成一了是吧,相当于表示删除了,哎,主要呢,就是因为我们还可能考虑要回滚啊等等的是吧,哎,为这个macc呢去服务呢,所以这块你不能真正意义上把它给删了啊,这个注意。
06:25
好,然后呢,MVC呢,能够解决的具体问题呢,就是毒血之间的阻塞问题啊,就我们刚才提到这个啊,并发性更高了是吧,降低了死索的概率啊,这个我们是一种乐观的方式呢,去解决这个读的这个情况的,然后呢,解决快照读的一个问题啊,就是呃,其实就是本质上讲,其实是一个事儿了啊,那么这是我们说总体上,那么具体细节上来看的话呢,大家呢,需要掌握的啊,或者你呃公平点讲哈,这个应付面试的话呢,大家需要呢,把这两个事儿呢,需要弄清楚。啊,然后这块你可以通过举例的方式呢,去说这个事儿啊就可以了啊核心一点就是MVCC,你可以理解成啊,如果用公式的话呢,那就等于咱们上面说到的两个呢,隐藏列加上一个叫哎,Undolo的版本链,哎,再加上一个叫read啊多版本指的是undolo,然后呢,诶并发控制管理指的是这个read啊以及呢呢,针对我们这个呃,管理的过程当中需要用到这个隐藏类,OK啊这个公式的话呢,大家你可以去记一下。
07:21
好,那么关于这一章呢,我们就介绍到这儿啊,这一章呢,说完之后呢,整个我们关于这个咱们讲的叫,诶第三个这种子篇章啊,叫做事物这样几个章节呢,咱们就告一段落了,OKOK啊,咱们最后呢,还剩这样的三个章节啊,涉及到的其他的一些日志啊,关于运维啊,维护相关的一些这个内容,OK。
我来说两句