00:00
那么接下来的话呢,我们要想讲清楚这个macc啊,咱们呢,还需要呢,复习两个内容啊,基于这两个内容的储备呢,我们再去看这个啊,那么这两个内容的话呢,第一个就是关于这个隔离级别,那我们提到了说事物啊有四种隔离级别,解决的呢是三种病发问题,对吧?这应该是闭着眼睛都能说出来,那四种隔离级别呢,啊意思呢,就是越来越往下啊,就是并发性呢就越差,对吧?那么解决的这个并发问题呢,是不是就越好啊,那相应的话呢,应该都很清楚,像可重复读呢,就是解决我们上边啊这两个问题,那创业化呢,就解决解决上面这三个问题,那读未提交呢,就是一个也不解决是吧?诶就这两个场景好,那这里边呢,大家需要注意的点是什么呢?就我们这张图啊,我放在呢,实际上是我们这叫S标准当中提到的这个相应的隔离级别,来解决具体的这个并发问题。对于咱们这个MY狗来讲呢,其实这张图呢,是并不准确的啊,这个呢,其实大家在这个面试当中哈,如果呢,谈到这个15隔离级别了,提到m macc了啊,这个问题呢,你一定要抛出来,它是一个很高大上的这样的一个说法啊,就是在咱们这个MYS当中,咱们可重复读啊,也就是我们默认的是不是隔离级别啊,那么这种默认的隔离级别,它不光解决了脏毒和不可重复读,它其实呢,把这个换毒问题呢,也给解决了。
01:18
啊,这个主要的原因呢,就是因为我们使用了叫MVCC。啊,因为在这个MVCC下呢,我们这个读呢,它其实读的是一个快照啊,它读的是个快照啊,也可以看成是一种乐观锁的一种实现方式,那么我们这个换读的问题呢,它也不会出现,那既然不会出现,相当于呢,我们就解决了啊这个换读的问题啊,那如果说呢,My circle呢,这个图怎么画呢?其实可以这样去画啊,可以这样去画,但是你注意哈,我们这时候呢,解决了这个换读的问题,而并不是说呢,我们MYSQ呢,就变成了串新化了,你这个串新化呢,相当于就是呃,这个用锁的方式呢来实现的啊,就是一一个的这样来就得排队,而我们这个MVCC里边呢,它其实呢,针对于读呢,是可以不用排队的。
02:01
啊,那就相当于我们这个不光解决了换族的问题,其实它这个性能相较于串行化来讲呢,是更高的啊这个大家呢,要能够表达清楚。好,这是我们说的复习的第一个内容,那么第二个内容的话呢,大家需要呢,清楚的就是隐藏字段加啊undolo的这个版本,这个呢,也是我们说的MVCC的实现原理的三板斧的其中两个。啊,隐藏字段啊,主要呢,指的是这两个字段,安lo呢版本料啊,那我们来复习一下啊,这个咱们前面呢,其实都讲过了啊,那首先呢,我们提到这个隐藏字段,针对我们具体的每一条记录啊,咱们说这叫一个行格式的,那么这个行格式里边呢,咱们当初提到过是不是有三个隐藏字段啊,一个呢是我们叫入ID是吧,就是如果你要是没有主键的话呢,啊也没有呢,唯一索引,非控的唯一索引的话呢,它会默认的给我们提供一个柔ID这样一个隐藏字段是吧?啊一个是这个隐藏字段,这个咱们就这里用不着啊,那么另外的两个啊,这个行格式里边的隐藏字段呢,一个呢叫做传塞式ID啊,一个呢叫回滚指针啊就它。
03:02
诶,这两个的话呢,我们需要用上啊,那么这个具体的一行记录当中的这个隐藏字段呢,叫transaction ID,它记录的就是最近的一次啊,更新我们这条记录的这个事务ID。啊是外地OK,然后下边这个呢,叫回滚指针,诶回滚指针呢,主要是跟我们这个安杜lo这个链呢,哎,去打交道的就是你这条记录啊,因为我们有可能会对事物进行回滚,对吧,那么我们就需要呢,记录你这个事物操作这条记录之前的各种各样的这个记录的这个信息,那我们呢,最后呢,跟我们这条记录呢,是不是要以一个链表的方式连接起来,是吧,就这样一个意思,那么在我们这个隐藏字段当中,就有这样的一个指针,就指向了你最近的这一次这个呃,Unlock的这样一个记录。哎,就这样意思,好,那我们结合了下边这样的一个,呃,表中的数据,我们再说明一下这个安lock这个版本料啊,假设呢,我们这里边表中呢,只有一条记录啊,ID是一的这一条记录,这一条记录呢,是我们事物ID为八的这个事物呢,给他引塞进去的。
04:03
啊,那么我们在隐私完以后呢,整个这个场景呢,就是长这个样子的啊,那么当前你这条记录,当我们说的这个隐藏的这个字段呢,叫传塞式ID,就是你输ID是八的啊,最近的一次呢,你去insert啊,然后呢,这个回滚值呢,就指向了你之前啊insert这样的安度啊,之前呢,咱们相当于你也没有任何数据嘛,是吧,之间不存在的啊。啊,那么这呢,多插一句啊,就是当我们这个隐私的这个安度在我们事物回滚的时候呢,那相当于呢,我们呃呃在回滚的时候呢,才会去起作用啊,那么如果我们这个事务已经提交的话呢,那你这个时候呢,安度这个log呢,这个日志就完全没有作用了。啊,那么就相当于有可能会被回收啊,要么呢就会被重用啊,就这样的一个场景啊好这呢,就我们说的这个事儿啊,插入一句,然后还调回来,现在的话呢,针对已经存在的这样一条记录啊,你这个事物呢,也都提交了,提交之后呢,事后我们现在呢开始啊另外的两个事物呢,对我们这个啊一条记录呢,进行一个啊阿的一个修改,那这里的修改的话呢,我是这样子的进行的,首先呢,我们这个叫十五十,那执行了两个update的操作啊改成李四,改成王五啊改完以后呢,我做了一个commit,然后接着我们这个事五二十啊就是事物这ID号呢是20,然后呢,诶进行了一个修改,也是针对ID是一的,改成了前期改成送八,那做了一个提交。
05:21
啊能理解是吧,那么这样呢,我们形成一个整个安度的一个啊这个操作链啊,就是长这个样子的。哎,就长这样子的,呃,那我们刚才说呢,最呃最初的是不是ID是八的啊,你做了一个添加,后来呢,我们ID为十的这个呢,是不是说诶改成李四了,李四后来改成王五了,然后呢,ID是20的呢,又改成这个前期了,又改成宋八了,那么最近的这个数据呢,是不是应该叫宋八是吧?啊这是我们最近的这样最新的这样一条数据。好,那么我们通过这个哎回滚指针的方式呢,就依次这样的去指向,哎,我们这个insert这样的一个暗度呢,因为你insert之前它不会有记录嘛,所以它就不会有这个诶叫回滚指针了啊这个注意一下。
06:04
啊,那有同学呢,可能会发现说老师这里边有个特点啊,就是说呃,你看这俩十是挨着俩20呢是挨着的,说有没有可能是交叉的去操作呀,就相当于我们这个事物呢,我呃把张三改成李四的说紧接着我这个就是前期啊去覆盖这个李四,然后呢,王五呢去覆盖这个前期,然后宋八呢去覆盖这个王五,可能吗?哎,注意是不可能的是吧?哎这个呢,还用啰嗦吗?啊,因为呢,你这个时候呢,我们在FD的时候呢,我开启一个事物了,是不是已经去加这个X锁了呀,啊,那你这时候这个事物呢,再去访问的时候,是不是就阻塞了呀,哎,不行啊,所以呢,这时候我是让他俩都执行完以后,然后我们这时候呢再去操作的啊现在你就释放了这个排查索嘛,OK啊行,这个呢就不用多啰嗦了,那么现在的话呢,我们这个呃,针对于ID唯一的这条记录啊,你看呢,它是这样的场景,而且呢,每一条记录当中,安lo当中都记录了你操作这条数据的时候呢,这个是ID。没有问题是吧,好,那这呢,就是相当于为我们下边讲这个咱们储备了这的一个内容,好下边呢,我们讲MVC的这个实现原理啊,重点呢,就把前面这两个内容,还有这个呢,我们穿起来来讲它是怎么做的。
07:11
好,同学们,咱们下边啊重点呢就要来讲解一下这个叫了啊,那么呢,是我们这个MCC实现原理的一个核心啊,我们刚才也提到了,只要说到MCC这个实现原理呢,实际上我们说依赖于三个结构对吧?一个呢叫做隐藏字段啊,这叫隐藏字段呢,实际上指的是两个啊,一个呢是它,一个是它,那么下一个的话呢,就是我们说安lo这个版本料啊,那对应的就是我们这样的一个结构啊,这个大家脑海当中有这样一个印象啊,那么第三个的话呢,也是最核心的一个啊,就是我们说的叫read,这三个合在一起就构成了我们啊MVC的个实现原理的一个核心。那我们说呢,M macc呢叫多版本啊,并发控制,那这里边所谓的多版本呢,指的就是我们的叫安lo啊,其实也就我们所谓的叫历史版本,历史快照对吧?啊,那么这个历史的数据我们进行读啊,就考虑读他们了,这个其实对应的就我们所谓的叫快照读了,OK,那么对这些历史的版本呢,我们进行一个管理,说不同的事物呢,过来以后呢,我们到底应该读哪一个呢?诶这个所谓的管理行为就是由我们这个呢来体现的。
08:13
啊来体现的OK啊,那就是他呢,来解决一下我们这个安log里边哪些呢,对于咱们不同的,呃,这个读事物过来了是可见的是吧,哪些呢,应该不可见啊,他呢主要是负责这个管理的问题啊。好,那下边呢,关于说什么是这个read啊这块有一段话,那大家呢,目前看一下啊,有可能这个理解上呢,会有一点障碍啊,说read呢,就是事物啊,咱们可以呢,说明确就是某一个事物啊,说某一个事物呢,在使用m macc这个机制进行快照读操作的时候呢,产生的一个图啊,通过这句话呢,我们想明确的一个点是什么呢?就是这个read,它跟谁是一对一的关系呢?来注意他跟这个事物是一对一的。啊,这个事物呢,就是明确的一个事物,比如我这块呢,写的再具体一点就叫事A,或者我写成叫一个事物啊也可以啊,我们现在有一个事物,这个事物呢,他想读是吧?哎,那这时候呢,我们就哎及时的会生成一个快照,哎这个快照呢,是一个读草读的一个视图的快照,那其实就是我们当前的这个read view啊,就是这个read view啊,这个大家注意一下。
09:15
啊,然后呢,说生成一个快照,说呢印度DB呢,为每一个事物呢,构造一个数组啊其实你可以看到就是我们这个里边呢,其实它存着好多数据啊,用这种数组,这种数结构呢来进行来存储的啊,它记录了什么信息呢?记录了我们系统当前活跃的事物的ID啊相对呢这呢就提到了我们read view里边有的这个东西。啊,那下边我们会具体的去说里边到底都有什么啊,先明确下,这里边呢,提到叫活跃的事物,活跃呢指的就是我们这个事物呢,呃,这个你启动了是吧,但是还没有去提交,那ug呢,就是你提交的这个事物呢,是不会在我们当前的这个read里边来记录的。啊,一会我们还会说啊好,那么既然提到这个read了,然后我们这呢,都已经把他烘托的很高了啊,干什么呢,都已经想好了是吧,这个你俩孩子叫什么都已经想好了,但是呢,现在就还没追这个女生呢是吧?下边的话我们得看一看具体该落地呢,如何呢?实施你的这个呃,追女生的这个计划是吧,我们开始这个呢,到底该怎么去体现啊。
10:11
说到这儿的话呢,我们首先呢,需要去明确一下我们这几种隔离级别,这个我们也好,MCC也好,到底是针对于哪种隔离级别来谈的啊,我们这明确一下就是针对我们这两种隔离级别来说的,在其他这两个隔离级别当中呢,是不会用到MVC的啊,为什么呢?你看一下啊,我们在这个read UN committed这种隔离级别下。啊,我们可以是不是读到未提交的数据啊,啊,这就我们所谓的脏读嘛啊,因为你这个读未提交的这种隔离级别没有解决脏读问题,你不就读到未提交的,既然你都读到未提交的了,那就相当于你读的是不是就最新的记录啊。是吧,你既然读的是最新的季度了,你跟我有关系吗?啊,我们瑞呢要解决的是不是历史的这个快照啊啊,它不是这个,呃,最新的数据啊,是快照的这个读的数据是吧?哎,所以说呢,我们就用不着咱们这个了啊既然的话呢,你也用不着MVC好,那如果呢,你是sible这种隔离级别呢。
11:03
串行化是吧,你串行化了不就使用加速的方式去解决吗?啊就导致呢,最后呢,我们这些事物的话呢,都得是排队啊,你排队呢,一个一个来啊你这块毒,不管你是毒也好,你是写也好,反正都得排队。啊,那么这时候呢,你比如说我们这时候是做这个读操作,那你读的是不是一定是你最新的数据啊,因为你既然能读它了,那就说明别的书了,现在都没有修改,因为你是串行的嘛,啊那你就是读的也是最新的数据,那IG呢,就是我们这种隔离级别,你也用不着我这个快照啊,你是用的是最新的,你又不是快照的,那你说用我们VIVO干啥,你用我MVCC干啥呀?都没有意义是吧,所以说我们这个MCC主要解决就是这个问题啊,这两个隔离级别在这个读已提交和这个可重复读啊,这个读里边咱们呢,哎,其实都用到的是这种啊快照的这个行为。啊,快照行为,我们都要保证读到的是什么呀,已经提交了的事物,修改过的这个记录。啊,因为你要没提交的要读出来,那不成脏毒了嘛,是吧,所以我们这块呢,诶解决了脏毒问题,那你就一定是读了已经提交的事物修改过的了,那已经提交这个事物修改过的呢,我们一定会在相应的这个啊日志的这里边呢,会做记录的啊那这呢就由我们MVCC呢说了算了,哎,我来帮你去解决这个问题。
12:16
啊诶,这里边提到我们说核心问题呢,就需要判断一下版本量当中啊,版本这个链当中的啊,就我们这个安lo这个版本链当中说哪一个版本呢,实际咱们当前事物是可见的啊,哪一个不可见,就我们这链里边呢,可能是不是有好几个数据啊,那我们现在有一个事物过来了,你说你让我读这个宋八呀,你还让我读这个王五啊,你还让我读出来这个张三呀,这个呢是咱们要解决的是不是这个核心问题啊。诶OK,好,那这呢,我们现在把这个事呢,先明确出来,MCC主要针对的是这两种隔离级别好了,那下面的话呢,就是我们这个设计上的这样的几个结构啊,咱也用不着呢,说咱们自己去设计一个呀,就像当初讲索引一下,咱们自己搭一个B加树啊,没必要了,这个呢,咱们就直接就上了啊。这个read里边呢,我们就直接告诉大家,它有这样的四个内容啊,就这四个内容,第一个内容的话呢,叫C啊传30ID,就是我们这个read呢,创建这个的这个事务ID啊,刚才我讲到了,说这个read呢,跟我们这个事物啊,啊,你当前这个事物是不是一对一的啊,那就相当于你这个read是谁造的你啊,或者谁的操作导致你创建了就是你这个ID啊。
13:23
好,这里边我们要注意一个事儿,就是咱们对这个表中的记录,如果做这个修改的话啊,增删改这个时候呢,我们会分配一个数YD啊,这个具体的分法的话呢,就是啊依次递增的啊,就是现有的这个事物呢,一些ID有了以后呢,我们再分配一个呢,就是接着往上去涨这个ID号就行啊,那么如果我们要只是一个独的事物的话呢,这个ID呢是零。啊,ID是零,你像我们上边这块呢,出现这个ID是十啊20啊,是因为你对这个表中的记录做过修改,所以你这些事物呢,ID都会啊,一直不停的往上去加啊,那读的话呢,广读那就是吃零啊,这个注意一下好,下边的话呢,我们这个read里边还会记录一个叫transion ids。
14:03
啊,那就相当于是我们事物ID的一个列表,这个列表一定要小心啊,我们是活跃的啊,读写事物的啊,ID列表活跃的什么意思啊,就是你现在呢,已经启动了,但是没有提交提交的事物,注意啊,提交了的事物不在我们这个里边。这个针对于什么呢?就是我们现在呢,有个失误,诶我诶启动这个失误了,这个事物呢,我一操作这个时候呢,我是不是就成产生了一个read啊,在我产生这个read view这一刻,我们看看当前这个系统当中有哪些事物呢,目前还没有提交,还活跃的呢,我呢就记录到你这个read view里边的这个列表当中了,那是不是也有些已经提交过的那些呢,就不会放在这里边。OK,那么除了这个之外呢,还会有两个啊,那其中这个呢,叫up limit ID啊,虽然它叫up,这个叫,但是你注意这个是小的啊,这个是当前活跃的,也就是我们这个列表当中啊,最小的那个啊,事物的ID啊,就是它,然后这个啊,这个大家可能不太好理解啊,这个呢说叫生成read时,系统中应该分配给下一个事物的这个ID值啊,这个读这句话呢,读的都很不顺啊。
15:05
嗯,这个是什么意思呢?我给大家举个例子,举个例子哈,你看我们这里边写的。诶,他注意这块指的还是我们系统这个最大的事务ID啊,系统中的事务ID,而不是我们这个正在活跃的事务ID哈,他这个意思,你比如说呢,诶,我们在这个一个具体的事物当中,我们这个事物呢,一操作,诶我们生成这个叫了,生成这个read的时候呢,呃,假设呢。嗯,这么着吧,假设呢,我们目前呢,是有哎三个啊事物啊,123有这三个事物是吧,这三个事物的话呢,哎,他会去操作某一个结构啊,然后现在的话呢,我们诶又生成了一个,咱叫读也好啊,生成一个独的事物了,不是这仨在生成这个独的事物的时候呢,我们是不是就会生成一个叫read了,我生成这个read的时候呢,诶注意一个点,我们这个三的这个呃事物啊已经提交了。啊,已经提交了啊,那所以呢,我们生成的这个里边这个活跃的这个列表啊,是不是只有一和二了。
16:00
对对呀,这就一和二了,好,那么我们这个呢,叫up limit ID,那这是谁啊啊,就是我们这个一啊,因为它最小啊,它就一,那我们这个呃,最大的这个呃下一个啊,最大这个下一个呢,有同学会想,那是不是说我们这个列表中最大的目前是二,是不是我们这个二呢,再加一是三呢?啊要注意跟这个三呢,其实有同学就重复了,比如我这个能够写成五啊。比如我这个写成五啊是吧?哎,那么有同学会说说我们这个呃漏啊limit ID说是不是这个二呢,就活跃的这个最大的这个值呢,加个一啊,这个呢,就要加个一,是不是三呢?注意不是三不是我们这个活跃的这里边了,而是呢,你之前提交的当中的最大的假设呢,我们有没有别的这个事物了啊,已经提呃,已经出现过的系统当中最大的ID值量是不是就我们这个五啊哎,那我们这时候呢,这个low limit ID,那这个值呢,记录的是几啊,应该是五加一啊,其实就是六。啊是六,就是跟我们这里边活跃的这个没有关系啊,你要考虑到就是可能提交的一些事物当中,有比这个值还大的啊,要考虑那个最大的,也是我们整个呃,系统当中最大的那个室外地。
17:04
啊,这个大家注意一下行,那下边呢,我们举了一个具体例子啊,怕大家不清楚,比如说呢,我们在生成啊,咱们这个事物的read的时候呢,当前我们一共有四个活跃的事物啊,那就是这四啊这四个后边这个值呢,就是你对应的这个事物这个ID啊,就是2358没有问题是吧?好,那么这里边呢,我们说这个,呃,列表的话呢,那就是这几个。啊,就这几个,然后的话呢,这里边儿这个最小的啊,这个叫up了,最小的是谁呢?就是它,那么最大的是谁呢?呃,假设呢,我们目前呢,这个系统当中啊,假设也没别的事物了,或者即使有别的事物,别的事物呢,已经提交了,那提交的里边呢,也没有比八这个大的好,那我们这里边所谓的这个最大的这个漏呢,我们就是这个八加个一了。哎,就是这两个意思。啊,就这样一个意思啊,行,那这呢,大家就先清入这个read view啊,它的这个结构,这个清楚以后,好,下面的话呢,我们就开始来进行这个所谓的管理了,这个要想把这个管理呢说清楚,咱们呢这块呢不妨,哎我呢就拿这个例子来说啊好。
18:04
那我们呢,清楚这个read这个设计结构以后呢,下边我们来看看它这个具体的实施特殊规则是什么样子的,好,有了这个read以后,我们在访问某条记录的时候呢,就可以按照下边这个步骤呢,来看一下某个版本是否可见了。啊,如果被访问的这个版本的这个传式ID啊,你比如说我们现在就是说select from students说where ID等于一,诶那么我们去select where ID等于一了。诶,那么这时候呢,我们是不是这是我一个15啊,我现在的话呢,相当于啊要查询了,那问题就是在于你要给我查出来是宋八呀,前期啊,王五啊,李四啊,还是张三呀,哎,这时候呢,是不是用我们这个了,但我们到底应该是用谁呢?哎,咱们先看到的假设呢,就是他。啊,因为咱们看到的先以这个最新的记录来说嘛,是吧,诶我们看到是他,然后呢,诶这里边被访问的这个版本啊假设呢,我们现在指的就是他啊因为呢,不一定被访问版十,他有可能这个这个这个这个咱们是以它来起始的是吧?哎起始的好,那么目前被访问这版本的传30ID的这个属性值及啊是不是20啊啊是20好,那与我们这个呃生成我们这个C拉操作的这个啊事物,呃当前你这个事物它是不是也有一个ID啊是吧?呃,这个它跟这个创建者是吧,如果说呢,我们当前这个生成read的这个事物,这个ID和我们这个ID是一样的,那就意味我们这是不是也是20。
19:27
那相当于成啥了,是不是相当于你自己啊,往这里边呢,修改了,然后你自己想查,那你自己修改了,你自己查肯定没问题啊,所以你就可以访问,那杨言之呢,你就把这个送八呢,就给查出去了。这个好理解是吧,好,那么接着说,如果呢,被访问的这个版本的ID的这个属性值啊,这个属性值它小于我们里边呢,这个最小的值。啊,比我们这个最小值还小,你想想这呢是我们现在活跃的,而我们整个系统中ID呢,它是依次递增的往上去分配的,然后呢,比这个活跃的这个值还小,那意味着我们这时候的这个值啊呃,相当于他已经呃提交了。
20:04
啊,就是我们这个列表中的这个值呢,都比这个值要大是吧,那就意味着我们这个事物呢,肯定是已经提交过的,那既然你已经提交过了啊,那这时候我们是不是就可以访问呀。对吧,诶我们提交过的就可以访问,我们读已提交呢,最起码呢,你这个隔离级别都都能访问了是吧,那更何况这个repeat了啊这这个呢也没问题啊,也能访问。好,接着往下说,如果呢,你要被访问的这个版本的传塞ID的值,它这个值哈,说大于或者等于我们这个里边呢,这个low啊,也是我们这个最高的这个是吧?啊这个最高这个相对我们还加了个一了哈,如果呢,比这个值呢还大或者是大于等于。啊,那这时候的话呢,我们说呢,就不能够被访问啊,这个大家能理解吗。啊,能理解吧,诶你想想啊,我们呢,在生成你当前这个read view的时候啊,生成read view的时候呢,我们记录它是当前这个活跃的了,啊当前活跃的里边呢,相当于我们说的这个漏的值,还不是说你活跃的这里边是我们整个系统当的最大ID还加了个一,但是呢,你这说你这个值呢,比我们这里边系统的ID值加一还大,那就意味着你当前这个修改。
21:07
啊,这个事物是不是在我们生成这个read这个事物之后出现的呀,那既然你之后出现的,那我们就不应该让你被访问。对吧,你人家后来的啊,你就不能访问了,所以这时候呢,我们就不能够让他去访问,哎,不能访问的话呢,呃,这个咱们再接着往下看是吧,你不行就再往后找这个历史版本呗,啊这个主意是不能被访问的啊好再接着看。说如果呢,诶被访问的这个版本的这个传塞ID啊,假设咱们还是以这条记录来说哈,它的这个属性值在我们这个范围之内啊,相当于在我们这提到这个范围和这个范围之内。啊,注意在这个范围内呢,啊,实际上呢,是有这么几个啊有这么几个,但是呢,这个也不一定就有这几个值,所以下一步的话呢,我们要判断的就是咱们这个传30ID这个值呢,到底啊跟这几个值呢,有没有相等的关系。啊说如果说呢,这个值恰好这里边儿有一个是有它,那就相当于呢,正好能对得上,能对得上呢,那就说明我们当前这个事物呢,是不是还是活跃的呀。
22:06
哎,人家是活跃的,那你说人家还没提交你,你能让他访问吗?是不是也不能够访问呀,啊,那就我们就不能访问好,那如果不在呢。那不在的话,那就意味着你这个事物呢,肯定提交了,你不活跃了吗?已经提交了,那既然已经提交了,我是不是就能访问呀,哎,所以呢,就可以被访问。啊,这块呢,大家听着应该是比较吃力一些啊呃,应该大部分同学是能听得懂的,咱们后边呢,这不有具体的例子嘛,啊讲到这个例子的时候呢,咱们给大家去来再来重复一遍啊好,那么整体上我们这个的一个规则啊,咱们就说清楚了,然后咱们在整体上来看一下啊,因为这里边我们提到说不能访问,不能访问,那你到底应该访问什么呢?我们来看一下整体的这个规则啊。好,那么我们下边呢,就相当于是要做一个啊,其实咱们刚才也提到了一个事儿了啊,就是我们要这个做一个查询了,做个查询的话呢,我们是不是在一个事务当中来体现的,那那么我们该怎么做呢?首先获取你查询这条语句的这个事物,自己的这个ID号啊,你获取你自己的ID号,然后的话呢,紧跟着针对你这个事物,我们会生成一个。
23:07
对吧,跟这个事物呢,是一对一的关系,然后呢,接下来诶,我们就查询得到这个数据,跟这个中这个事物的这个版本号呢,进行比比较了啊,那其实就是我们上面说的这个事儿啊,那如果呢,不符合我们这个这个规则啊,那就相当于我们呢,比如说呢,不可以被访问,那我们就接着呢,往下找这个版本链中的这个数据啊,依次往下啊,越往后的话呢,这个历史数据就越旧一些是吧?啊越靠前的话呢,这个数据呢,相对就越新一些嘛。好,我们呢,就从这个历史版本里边呢,哎去找啊,那最后呢,找到符合我们这个规则的数据啊就可以了,那有同学可能会说,那我们这块依次去找的时候呢,假设这个事物呢,都都这个相当于是不能被访问啊,比如不可见的,那我们就一直找一直找,一直找到最后呢发现没有了,那就相当于这时候查询的结果呢,就不会包含我们这条记录。啊,咱们这边是讲m Mac针对是这个读写操作,所以我们现在主要讲的是这个读是吧,读的话,那就意味着你既然都对你不可见了,那你最后呢,就不包含记录了。
24:02
啊,这个注意一下,OK啊行,那么在这呢,我们就说清楚这个事儿了,然后呢,下边我们再说一个问题啊,就是咱们针对当前这个事物呢,我们是会诶获取一个read view对吧?那么这个read view呢,跟我们这个事物呢是一对一的,这没问题,那么事物里边呢,我们是可以,诶这让我读,诶我们是不是还可以读是吧?诶咱们主要是针对读呢去操作哎,去生成这个read,那么这里边就面对一个问题,就是我们是每一次读都生成一个,呃,更新一下read啊还是怎么回事呢?诶这里边呢,就跟我们这个隔离级别有关系了。啊,这个事儿呢,大家记一下啊,记住啊,这个事儿呢,也是咱们设计,你要说为什么啊,其实呢,也就是我们只有这样去设计呢,才能够保证我们西安的这个隔离级别它是准确的啊,能够解决对应的问题,好什么意思啊,说呢,我们在这个隔离级别,如果叫read committed啊,这个read committed啊,少一个这个T啊如果呢,你是叫独提交的这种隔离级别,我们怎么着呢?每次你做一个查询,我们都要获取一次。
25:04
啊,每读一次呢,都需要获取一次read啊,这个大家要注意啊,因为这时候呢,你看我们首先这个read咱能保证的是你读已提交的能看到啊,因为咱这块呢,不是已经提到这个保障了是吧?啊那么你要是这个,嗯,这个这个不同次数这个读呢,呃,有可能读已提交里边呢,会出现这个,呃叫什么不可重复读的这个数据啊,那就意味着我们就得重新获取一次,因为你重新获取一次,是不是才有可能去找到那些不可重复读的这个数据啊。啊对吧,哎,所以我们这个呢,主要哎再获取一次呢,主要目的呢,是为了保证呢,保证你有可能会出现不可重复读啊,我们既然到了这种程度了啊啊,既然想主动出现这个问题啊。啊,因为呢,咱要区别于这个可重复读嘛,是吧,可重复读呢,它是不是呃,要避免这个不可重复读,那怎么办呢?啊,就是你每次读的时候呢,你尤其你后边这些读,我就不让你再去生成read了,诶这样你就没招了是吧,你再一读诶还是用最初的那个,那咱哥俩肯定每次读出来的数据呢,都是重复的了,就不可能会出现不可重复读了。
26:05
对吧,诶就这样的场景,好,那大家呢,把这个结论记住啊,这个读一提交的场景下,每读一次哎,获取一次啊,那么我们这个叫诶可重复读的场景下啊,隔离级别下呢,我们只在第一次select的时候呢,才会生成这个read view。好,那么关于的这个核心啊,咱们就说清楚了。
我来说两句