00:00
好,同学们,咱们接着讲,那么针对于我们MYSO高级的话呢,咱们这呢,一共是有这么多章对吧?诶这么多章呢,咱们又分成了四个小的篇章,那么第一个篇章呢,是从这个第一章呢,一直到我们的第五章,相当于讲的是这个Linux环境下的安装,以及呢整个我们MYSQ的一个架构。那么第二个小的篇章呢,是从第六章一直到第12章,提到了我们这个索引的结构,还包括呢,我们叫数据库调优啊,这呢是我们说比较重的一个章节啊,重要还有呢,这个内容量上来讲也比较多一些。那么第三个小的篇章呢,就从第13章一直到我们的第16章,主要说的呢就是事物啊,然后剩下的话呢,是我们第四个篇章,那么咱们呢,诶,已经讲完事物里边的三个篇章了啊,接下来的话呢,我们来看一下这个第16章,叫做多版本并发控制,哎,我们看一看这一节主要呢,解决的是什么问题啊,多版本并发控制,那我们翻译成对应的英文啊,当然其实是从英文导成咱中文的啊,啊叫multi啊,Conrrrency control,哎,多版本并发控。
01:00
数值,那我们取每个单词的这个首字母啊,MVCC是吧,就是我们这里要讲的这样的一个技术。这个MVC的话呢,呃,首先呢,从面试的这个角度来讲啊,在问到数据库比较高级的这种场景下呢,诶通常呢,就会问到这个MVC了,相对于呢,它还是比较偏底层的一个内容啊,这个注意一下,然后的话呢,如果从实际开发的这个角度上来讲呢,实际上呢,大家其实基本上你不会碰到MVCC啊,为什么呢?啊,因为我们在使用数据库的时候呢,其实关注的就是这种隔离级别对吧?那么隔离级别呢,我们可以去做设置,然后我们清楚呢,在不同的隔离级别下解决什么样的并发问题啊就可以了,那么我们这个ACC呢,实际上上就相当于是在啊这个隔离级别的啊,在下层我们如何呢去实现啊,在相应的隔离级别下呢,啊,更好的实现这种并发是吧,这样的一个场景啊,用到了这样的一个技术。所以说呢,它是比较偏底层的啊,就面试当中呢会常用,当然呢,我们基于学习知识的话呢,一方面呢,你可以学更多的应用场景的技术啊,同时另外一方面呢,是不是就要挖的技术更深入一些,那我们呢,诶还是有必要呢,去看一看这个MCC到底解决的是什么问题,对吧?那么在具体讲它之前啊,咱们呢,先看一下这个上一章咱们讲的叫锁。
02:17
哎,咱们在讲这个锁的时候呢,其实已经提到过MVCC它的主要的作用了。是吧,咱们已经讲过了啊,那么我们看一下是在哪讲的,哎,咱们先做一个复习,在讲到这个所的时候呢,首先我们提到了说并发这个事物访问相同记录的几种行为啊,一个事物呢,读,另外一个事物也是读,就是读读的行为,那么这种场景的话呢,我们说不会有任何的呃,并发的问题了,所以呢,我们是允许他俩同时去读的啊,所以并发性呢就比较好,那么写跟写的话呢,因为都会对我们这个记录呢,呃,进行改动了,所以我们要求的话呢,是不是都要加锁呀。啊,所以这个没啥可讲的啊,就是加锁让他们排队啊这样的去执行,那么我们重点关注的,诶,咱们重点关注的以及呢,我们在实际开发场景当中比较多的是不是就是这种读写或者叫写读的这种场景,对吧?那么读写写读我们为了保证他们啊,是在相应的隔离级别下呢,你是没有脏读的啊,或者说呢,也不能有这个不可重复读,或者说呢,你也不能有换毒是吧,我们要想解决这些问题。
03:17
啊,那么这时候的话呢,我们该如何去办呢?啊,这上提到了两种方案啊,你看我们这个内容呢,是怎么引下来的啊,你要清楚两种方案,什么方案呢?第一种方案呢,就是我们使用啊,咱们先说第二种方案吧,第二种方案呢,是咱们上一章就是讲这个锁的时候呢,咱们讲的就是读和写啊,咱们都采用加锁。对吧,都采用这种加锁的方式啊,这个咱们前面不也都讲过了,说比如针对这个毒,咱们加了比如一个X锁是吧,这个排大锁,那你另外的一个增删改是不是也过来不能去操作呀,啊产生这个阻塞的这个行为是吧?哎,枷锁呢,是咱们这个第15章啊重点咱们要讲的这个事儿,那么枷锁的这种场景呢,其实就导致我们这个并发性啊,稍微的会差一些啊,因为呢,你最终目的不也是排队嘛,是吧,就出现这样个场景了啊,那我们有没有更好的一个方案呢?诶这呢,我们就提到了,就是MVCC的这种解决方案。
04:06
啊,那么MVCC当中,咱不是说呢,会涉及到解决的问题呢,是读写的这种情况是吧,那么写的话呢,我们让他呢去使用呢,是最新的版本啊,基于最新的这个,呃,数据的这个版本呢,我们去写,说白了就是你这个写操作呢,哎去加锁。啊,我们是一种相当于就是一种悲观所的体现啊,那么我们这个毒的行为呢,我们就使用这个MVCC呢,来去来体现。啊使用率MVC来体现,那么呃,整体上来讲呢,我们就可以说呢,是一个MVC的解决方案,那么我们能够实现的点呢,就是读跟写呢,诶不冲突啊,因为MVC呢,更多的它是倾向于是一种乐观所的场景了啊,那么毒跟写不冲突的话呢,我们并发性是不是就比我们第二种方案呢要好一些呀。啊,就是这样的一个原理,好,那么先宏观上呢,大家知道MVC这样的一个场景,然后呢,咱们下边呢,来展开对这一的一个讲解。
05:00
好,对这章讲解啊好,首先呢这块呢,关于MCC呢,相当于是一个概述啊,说顾名思义说MVCC呢,就是通过数据行的多个版本管理,来实现数据库的一个并发控制。啊,它比我们这个读和写度家索呢,呃,效果要好一点啊,那么多个啊数据行的就是我们这个行记录啊多个版本,这个多个版本啊这multi version是吧?怎么体现呢?哎,我们先呢,诶抛出来就是通过我们的undolo来体现的啊unlo呢,咱们前面讲事物,呃事物的这个日志的时候呢,提到过对吧?诶多个版本嘛啊,你对它进行增删改的时候呢,我们每个版本呢,安lo不都记录了吗?啊OK啊,那么这个管理呢。那这个管理呢,就是体现了你,诶不同的事物呢,过来的时候呢,你到底要让他看到哪一个版本呢,哪一个安lo的记录呢?呃,这个管理呢,其实呢,是通过我们这个read啊来体现的。所以说呢,咱们要想提到啊,要提到这个MVCC啊,能够实现我们这样技术,其实核心上来讲呢,啊,如果面试问到你说你是怎么理解MVCC的。
06:03
啊,大家呢,一句话啊,就是比较高质量的一句话是什么呢?哎,就是你把这个事呢,抛出来,就是MVCC的,它的实现原理呢,其实就是依赖于诶我们说的这三个事儿啊隐藏字段,这个叫unlo,还有这个read啊呃,隐藏字段呢,它里边有一个呢,我们是ID是吧?哎,因为我们read里边要用它,你说呢,这仨也行,或者你说后边这俩也行。啊,因为我们叫多版本并发控制是吧,多版本呢,就是通过unlo来体现,哎,并发控制控制呢,你也可以理解成是个管理,谁来啊,哎来哎,所以啊准确来讲就是这哥俩呢,加一起就构成了我们MVCC的核心。啊,你这样一句话下去呢,对方呢,应该。哎,就觉得说你这个是靠谱的是吧,OK啊,那么使用这项技术的话呢,我们能够使得呢,因诺DB啊,在事物隔离级别下呢,来执行一致性读的时候呢,就有了保证啊,这个所谓的一致性读啊,大家可能不懂是吧?哎,他其实说的就是我们的这个快照读。啊,那么这个快照读又是什么呢?其实就是我们前面提到的,哎,咱们要解决的问题呢,啊是用MCC不是就解决这个读写的问题嘛,那么这个写呢,咱们其实对应的呢,是叫最新版本,其实呢,就相当于是叫什么呀,叫当前读啊叫当前读,而我们这个呃解决这个读写问题里边前面这个读呢,其实呢,我们就是相当于叫哎叫哎叫快照读。
07:23
啊,快照读呢,也可以理解成了就叫做一致性读啊,它俩是一个意思。OK,那相当于我们要是读这个快照的话,你到底读哪个版本呢?我们用MCC去解决就可以了啊,换言之呢,就是为了查询一些正在被另外一个事物更新的行,那并且呢,可以看到啊,他们被更新之前的值。那你要是看到他现在正在更新这个值,那不成了单独了吗?对吧,你得看到他之前的这个值,那之前值诶就是MCC来做这个事。啊呃,那么这样呢,在做查询的时候呢,就不用等待另一个事物呢去释放所呃你要读到人家正更新,你读到了那就是脏读,你要是等着他读完这个更新完以后呢,你再去读呢,哎,那不就得是呃成了串行了嘛,哎,你就相当于是锁的这种解决方案了,是吧,OK。
08:07
好,接着我们说呢,这个MVCC没有正式的标准啊,在不同的数据库管理系统当中啊,这个MVCC这个实现方式啊也是不同的啊,并且的话呢,它也不是普遍适用的啊,这个大家注意一下,你包括咱们MYSQL当中,不同的这个存储引擎支持力度也不一样啊,只有呢,我们这个印度DB当中啊,它支持了这个MVCC这种机制啊,这个注意一下啊,好,那么刚才呢,我们其实提到两个概念啊,那咱们把这两个概念呢再说一下啊,一个呢叫快照读,一个呢叫做当前读。哎,我们使用m macc呢,主要解决的啊,不就是咱们上一章讲的这种血的这种场景的这个冲突是吧?哎,更好的提高这个并发性的一种解决方案啊,相较而已呢,毒跟显都加锁的方案呢,要更好一些啊,我们不加锁了啊,非阻塞式的并发毒啊,这里边这个毒啊,就是我们所说的叫快照毒。啊,就是咱们刚才说的解决读写冲突,这个读就是快照读啊,这个写,这个写针对的呢,叫做当前读。
09:03
好,你比如说呢,我们在这个一个具体的事物当中啊,我们要是这样的写了一个select语句,咱们又没有对他进行任何的这种枷锁的行为,对吧?啊,那么此时的话呢,它其实就相当于是一个快照读啊读的就是一个快照,那具体呢,说是哪一个快照啊,那这时候呢,其实就跟我们这个呃,Read呢就有关系了啊,就得需要去管理了啊好,我们下边呢都会讲啊。嗯,下面的话呢,就是一些介绍了啊,说既然呢是基于读版本的啊,基于这个read的,那么我们快照读呢,它有可能读取的并不是最新的数据啊,有可能是之前的历史版本啊,不一定是最新的啊,当然你也不能说他一定读的是旧的啊啊,它有可能是新的。呃,再者的话呢,这个快照读呢,我们的隔离级别呢,不是串行的啊,你要串行的话呢,那不就退化成这个当前读了啊,因为呢,呃,一个一个来,那么这时候呢,别人都提交了,你才能够访问,那那你读到的不就是最新的数据,那其实就是当前读啊,当前读就意味着我们读的是记录的最新版本。
10:00
啊,不是记录啊,历史记录的版本,那我们在前面呢,加锁的时候啊,这个对我们的读操作啊,或者是增删改操作,我们加锁的这种场景,其实呢,都相当于啊,要获取的就是当前图。你想想啊,我们既然想获取最新版本,然后呢,我们这个这个那你就得付出点成本嘛,你得加锁是吧,那你说我加了锁了,读的还是历史这个这个版本,那就没必要了,那直接我们使用这就完事儿是吧?诶我们的这个加锁呢,主要目的呢,诶我们会有一定的阻塞是吧?啊主要目的就是为了我要读它的最新版本啊,这个大家注意一下。好,呃,核心的一句话啊,就是我们macc呢,它解决的就是我们上一章提到这个读写冲突的问题,而这个读就是我们说的快照读这个写啊,它一定是针对的我们是最新的这个版本,叫当前读的这个数据啊,通过加锁的方式呢去实现啊,先理解一下我们这个概念。
我来说两句