00:00
好,同学们,咱们接着来看啊,那么前面的话呢,我们关于各种啊丰富类型的这个锁的讲解啊,咱们就告一段落了,下面的话呢,咱们来看一看这个锁的内存结构啊,简称呢叫做锁结构,那前面的话呢,我们在一开始讲解这个啊,读读写写的这个情况的时候呢,其实就提到了这个叫锁结构了,对吧?那么针对于我们说具体的一个事物,他如果呢去操作啊整个表也好,或操作一条记录也好,这个时候我们就会针对这个事物呢,诶对于这条记录就会生成一个锁结构,当时呢,我们提到这个锁结构的时候呢,只提到了内部的两个主要的这个属性,一个呢,就是我们关于这个事物的一个记录,另外呢,就是我们当前这个事物呢,是否是可以来操作这条记录的啊,是需要等待呢,还是说我们现在就可以去执行呢?诶这呢有个叫its waiting这样的一个属性啊,那现在的话呢,我们现在呢,就是呃,具体的来讲解一下这个锁结构当中,除了这两个信息之外,还有哪些信息对吧?诶这是一个,然后另外的话呢,我们在讲到这个行锁的时候啊,你比如我们提到这个记录锁在这个位置。
01:00
那我们就提到了说给ID啊,值为八的这个记录呢,加一个类型叫lock record not GAP啊,就是非间隙所的这样的一个记录。那么这个字段的话呢,它到底是在哪体现的呢?啊,包括我们下边提到这个间计所也好,这个临建所也好,你看是不是都有这样的一个声明是吧?那么这个声明啊,其实就是也记录在咱们的叫所的这个内部结构当中的啊,那下边的话呢,我们针对这个内部结构啊,哎,咱们做一个说明。OK啊,那咱们这块呢,就开始了,呃,那么这时候的话呢,我们首先呢,关注一个问题,就是我们事物呢,针对于你表中的记录啊,咱们去生成这个锁结构,对吧?那么这时候呢,我们是针对一条记录啊,生成一个锁结构呢,还是怎么样个情况呢?对吧?你比如说我们这里边有个事物啊,我们select from user,然后呢,进行了一个,呃,相当于是一个S锁了,对吧?诶共享锁,那么这时候我们是生成了一个锁结构呢,还是说呢,每行记录生成一个呢?诶如果这个表中的记录数非常多啊,你比如说有这个1万条记录,那我们要是生成1万个这个锁结构的话呢,那就很崩溃了。
02:01
对吧,哎,那我们如何去看待这个事儿啊,哎,这个我们很难说一句话呢,说清楚啊,主要呢,有这样的一个判断。说呢,如果呢,你这个相当于你要加锁的这些结构哈,它是在同一个事物当中进行加锁的啊,针对的是同一个事物对吧?然后呢,被加锁的这个记录啊,还在同一个页面当中啊,你看还有这样的要求啊,枷锁的类型呢是一样的,等待的状态也是一样的啊,等待状态就我们上面说is waiting是吧,如果这些呢都是相同的话呢,哎,那我们就是啊生成一个锁结构。啊,就会生成一个锁结构啊,这块大家注意一下行,那么下面的话呢,我们具体来看一看,这个锁结构呢,哎,分成几个部分啊,整体来看的话呢,是不是123456,哎是不是这样六个部分呀,然后呢,在第三个位置上呢,会有点区别,那就得看你是一个表锁还是个行锁,他们记录的信息呢,还稍微有一些不同行,那下面的话呢,咱们就相当于呢分别呢,给大家去做这样一个讲解啊,讲解的话呢,诶,我们为了方便大家呢,去宏观上呢来进行一个理解,我呢就把它放在这儿,首先的话呢,我们来看第一个信息叫所所在的这个事物的信息。
03:07
那我们说了啊,这个锁结构的话呢,它其实就是我们某一个事物呢,是不是要操作啊一些这个记录啊,生成的这个锁结构,对吧,那首先的话呢,我们就需要呢,记录一下你这个所结构对应的这个事物啊,到底是谁啊,我们现在呢,就在这块呢,做了一个标识。那么这块大家需要注意的点是什么呢?就是我们这时候呢,记录的信息,它其实只是一个指针,然后呢,指向我们内存当中啊,真正的你这个事物啊,更多的信息的这个位置啊,然后这呢,不是把这个事物的所有信息呢都记录在这啊,这个呢就有点浪费空间了啊,我们只是一个指针,指指过去啊就行啊,这是我们说的这个所的这个事物信息啊就清楚了,那么下边这个呢,叫索引的信息。啊,那么索引信息就是我们当前这个呃,事物当中啊,对应的我们操作这个索引啊,相关的一些记录啊,我们呢,就会在这里边儿呢,做一个记录,也是一个指针的一个形式,OK。
04:01
然后下面的话呢,就涉及到了一个叫表所跟行所的信息,表所的信息当中呢,我们提到叫表信息和其他信息,那么这个呃,表所里边啊,我们呢,需要记录的就是呃,是对哪一个表来进行这个加锁的,还有其他的一些这个辅助的信息啊,这个大家了解一下就行,那么关于这个行锁,我们需要记录了三个这个重要信息啊,就我们说的这三个重要信息,那第一个信息的话呢,叫做space ID,就我们这个记录呢,它所在的一个表空间是哪个是吧?然后呢,我们这些记录的话呢,它所在的页号呢是多少,那这个呢,一看呢都很明白啊。在下边这块呢,提到一个叫NB次啊,这个叫NB次,然后呢,我们整个这个大块上来讲呢,也最后有一个呃字段呢,叫做一堆比特位啊,这是翻译成中文的啊,一看呢就很业余啊,但是呢,大家都这样翻啊,那我们这块呢,也就拿过来了啊啊一堆比特位,这个你看跟我们这个NB呢,诶似乎呢,你看是不是一个道理啊。啊,但是你注意我们这个NBS呢,它只是记录了一个值啊,那么真正上我们这块呢,有好多这个比特币呢,七三其实呢,是在我们最后这样的一个字段当中,那么这个是干什么的呢?诶大家注意一下,我们现在呢,是不是这个叫针对这个行所来讲的是吧?诶针对这个行所来讲的,那我们有可能是不是锁住了我们这个表中的多行数据啊。
05:18
啊,又由于呢,我们这种生成的这个呃锁结构呢,它是不是针对于具体的一个页来讲的呀。是吧,诶针对是具体一个页来讲的,那么这时候的话呢,我们就需要怎么着呀,来记录一下啊,你比如说我们这个页当中假设哈,咱们放了这个,诶100条这个记录啊,那么100条记录呢,呃,在这一页当中,是不是有的记录呢给锁住了,有些记录呢,是不是就没有给人家去锁住啊啊那么这时候呢,我们就需要呢,去记录一下,说哪个记录锁了,哪个记录没锁,哎这样一个场景,那我们这时候呢,真正记录这个事儿呢,就放在了最后的这个叫一堆比特位这块了。啊,就放在这块了啊呃,你比如说我们这个页当中有100个记录,那可能我们直观的想象的话呢,是不是这块呢,我们就放100个这个bit就可以了。
06:03
对吧,哎,放100克这个bit就可以了,然后呢,你要是加锁了呢,比如我们就用一来表示,你要没加锁呢,就用零来表示每一个这个bit啊,只是零和一这两种值的情况,我们就表示你对应的这个记录啊这样一个情况。对吧,诶,这是这个事儿,呃,那是不是真的只有100个呢?诶这块我们要说一下,在一个页当中啊,咱们这里边呢,说的是100个记录,但是这里边你不要忽不要忽略的,咱们讲这个页结构的时候提到过,假设呢,我们有100条的记录,其实你还会有两个,是不是一个呢,叫in free nu,还有这个叫呃,S,就是我们这个页当中的最小记录和这个最大记录。啊,这个你别丢了啊呃,我们刚才说的100呢,指的是我们真实呢,就是存在100条这个数据,那其实加上这俩话呢,是不是就102啊啊这个大家注意一下,而且呢,我们这里边呢,相当于每一个这个记录的话呢,它还会有一个啊既然咱们说到这了,就看下这个最后是不是还会有一个呢,叫做hi number这样的一个记录啊,那么相对应的咱们前面都讲过了啊,这个in纳呢,它这个纳呢是零,这个纳呢,它这个呢是一,之后呢,你再多加一条记录,这个值呢,就会增加一,诶所以这呢,诶我们说呢,这个记录呢,它就跟这个呢一一的一个bit啊匹配一个。
07:13
啊,然后呢,通过这个呢,我们去记录一下啊,你到底是哪一条记录呢,被我们当前这个事物的这个锁结构给锁住了啊对这个大家注意一下啊,那么按照我们刚才这个描述,那是不是我们就一共呢,比如说有102个这个比特V呢?啊,实际情况呢,也不是啊,因为呢,我们后边呢,有可能在当前这个页当中还要插入一些新的记录,对吧?那么要插入新的记录的时候呢,我们这块呢,再去改啊,那就没必要了啊,因为一个bit特呢,占用空间也很小了,所以呢,我们在这个诶存放一堆比特币的时候呢,我们不妨呢就会多放一些。啊,多放一些啊,然后留出来呢,就是你后边呢,有可能要新新添加的这些记录啊,对应的我们是不是要锁住这样的一个情况啊,OK,好,那么这块呢,是真正来放这个比特位的,而我们在刚才提到的这个行所的这个第三个这个属性字段当中呢,它只是来记录一下个数啊,你比如说我们这是110个是吧?哎,然后这就是写个一百一这个数,然后这块呢,是真正来放这个比特位的啊这个大家注意一下。
08:11
好,这个呢就说到这儿,然后呢,我们下边这个呢,叫tap mode啊一看呢叫类,这个tap叫类型的一个模式是吧,然后这个参数的话呢,又分成了三个段。又分成了三个段啊,分别呢,从这个低位到高位呢,这叫lock mode啊锁的模式啊,锁的类型,然后记录锁的类型啊一看呢就有点蒙圈了是吧?诶我们这块呢,一说呢,大家能明白啊,那么首先呢,我们看这个低的这个叫lock mode啊叫索的模式,这个索得模式呢,你看它记录的你是这个,诶这个我们叫is是吧?你是一个共享型的一个意向锁还是一个呃独占型的一个意向锁,还是这一个X锁,还是一个X锁,还是我们这个叫呃自增这样的一个锁是吧?诶这块呢,有一个记录。啊,你像这里边呢,实际上就是我们前面提到的,你看是不是有这样的一些行为啊,有一些呢,是不是都是我们提到这个叫表级的这个锁是吧?哎,但是这个位置的话呢,也不一定非得是一个表级的啊,因为你有可能是表级的这个共享锁,也可能是这个呃,行级别的一个共享锁啊,这个都是有可能的啊。
09:10
诶这块呢,就是相当于是记录这个叫锁的模式啊在这儿啊,然后的话呢,我们这个叫锁的类型叫lock tap是不是就它呀啊五到八位这块去记录啊,然后它记录的话呢,五到八位其实是四个bit特,但实际上呢,我们只用了两个啊,就是从第一位来讲的话呢,呃,先说第五个啊,它呢记录的值如果是一表示呢,你就是个表极所啊,那如果你要是零的话呢,就不是表极所了啊第六位的话呢,如果是一表示呢,你就是个行级所。所以呢,我们通过这个第五位和第六位来确定呢,你是一个表极锁还是一个行锁啊,这块呢,注意一下,那么七八这块呢,相当于是没有使用啊,没有使用好,那么诶再往下再往后的话呢,叫record lock tap是不是就我们这个位置啊,那么这块位置呢,来记录的啊,大家你会发现呢,诶就是主要呢,是不是叫诶零件锁呀,GAP锁呀,记录锁呀,这呢,是不是就我们提到的这个就是行所里边的这样一些结构啊啊那我们像刚才提到说这个记录锁,那咱们提到叫lock record GAP是吧,就是它,然后呢,我们在这块。
10:09
啊,往下走。嗯,啊,在这块的话,我们是不是就能找到叫lock not GAP啊这呢就表示是呃,一个正经的一个记录锁是吧?哎,就是针对这一条记录的这样的一个锁,哎,就这样个情况啊,相当于呢,我们这块呢,你看更多的体现的其实就是我们的这个叫行级的这种锁是吧?诶这样个情况啊啊那么说到这儿了啊,大家可能会想说我们这个is waiting这个属性在哪呢?诶这个is waiting这个属性呢,你注意啊,出于这个空间节省的一个考虑呢,它其实占用的是我们这个第九位的这样一个空间啊,第九位这样一个空间。如果说我们这个第九位这个比特这个值呢,它是一表示呢,我们这个is waiting呢是true,相当于你现在就得是等待状态啊,那么如果是零的话呢,诶,那就表示你现在是可以去操作我们当前这样的一个呃,对应事物中的这个记录的啊,相当于呢,就是获取锁呢就成功了啊这呢是记录在我们这个第九位的这个位置上的啊,注意一下好,那么关于我们这个叫ta Mo的呢,我们就说清楚了啊,相当于它这个记录信息呢比较多。
11:05
然后下边呢,还涉及到有一些这个其他的信息啊,这个呢,就涉及到了去识别我们当前这个锁结构啊,相对应的设计的一些哈希表啊,一些链表的一些这个信息啊,就在我们这个位置呢,去记录了好一堆比特位啊刚才我们也说清楚了啊,就是针对于我们这个页当中啊,到底哪个记录我们是啊,这个要锁哪些记录不锁是不是一个一个的要记录一下是吧?啊就这个情况好,那么这儿的话呢,我们就说清楚了,关于这个锁的一个内存的结构啊,大家呢,熟悉一下。啊,同学们,咱们关于锁这一章呢,最后还剩一个内容叫做锁的一个监控啊,就是关于呢,我们整个呢,事物的在执行过程当中会涉及到一些锁,那我们可以通过哪些语句呢,去查看关于这里边的锁的情况啊这呢就提到了我们这叫锁的监控,那么前面的话呢,实际上我们在讲这个隐视锁的时候呢,咱们使用过其中的一个指令,就是从我们这个叫performance stemmer,相当于系统给我们提供的这个库当中的这个表里边,能够查看一下当前我们等待这个锁的这样的这个事物的一个场景,对吧?哎,这是我们现在就是使用了其中的一个,呃,监控的一个工具,那么除此之外呢,还有哪些工具呢?诶我们这儿呢,来进行一个系统的说明。
12:11
那么首先的话呢,我们说比较常用的呢,属于我们这样的一个啊,一系列的这个参数叫in DB肉lock啊,然后呢,它有其他的一些具体的参数,通过这个呢,我们能够查看一些,查看到一些这个主要的信息啊举个例子啊,CTRLC,那你比如说呢,回过来咱们呢,就针对于咱们前面呢,做了这么多这个操作了啊,我现在呢把它呢粘过来,然后呢,我们做一个执行。好,大家呢,会看到呢,呃,以我们这个字段开头呢,有这样的一些这个属性字段对吧?那分别呢,代表的是什么意思?来我们说一下啊呃,第一个呢,我们叫current with啊,它呢表示呢,就是当前正在等待这个锁定的一个数量啊,正在等待这个锁定的数量现在没有是吧?嗯,那么下一个呢,叫做locktime啊这个呢,注意对应的是我们相当于从系统启动到我们现在为止这个锁定的一个总时长啊,一个总时长是这么多,那下边这个自然而然的是不是就是平均的一个啊,花费这个时长了,就是所等待的平均花费时长,这个呢,就是我们所在等待的时候呢,最多花费的这个时长啊,你看超过这个50秒了。
13:14
那相当于它呢,是不是就是我们说呢,50秒是一个叫timeout啊,就是相当于一个时间啊,好,然后下边呢,叫with,相当于我们所等待的一个总次数。那总次数呢,是31次对吧?诶这样一个情况好,那么知道这些数据之后呢,我们重点呢,需要大家去关注的呢,呃,应该说呢,是有三个啊,一个呢是总时长,还有这个平均时长,以及呢,我们最后呢,就要等待的一个次数啊这样呃,如果大家啊,当然这三个里边呢,更重要的要关注的就是应该是这两个啊,如果大家你发现呢,我们整个所等待的这个次数啊,还比较多,呃,在比较多的情况下呢,这个平均花的时间呢也都比较多。啊,因为这两个呢,其实加成这个相应的乘起呢,不就是对应的是总时长嘛,对吧?啊,那你如果说这两个都比较多的时候呢,你就需要呢,去查看一下我们相关的这个,呃,事物相关的这些操作中的这个结构,你看看是什么原因造成我们这个锁这么多,而且呢,这个花的这个时间还都比较长,那需要呢,去做一个啊分析是吧,这个就是我们这个监控的这个工具啊,那么除了它之外呢,我们具体的如果你想看看呢,目前呢,说有哪些锁呢,还在等待啊等等,那这种场景啊,可以怎么办呢?我们可以使用其他的一些系统的库当中给我们提供的一些表。
14:28
啊,一些表啊,那么以前的时候呢,我们是使用这个叫information STEM啊,在这个库下呢,分别对应的有三张表啊,就是我们这里边写的啊,这个in DB啊,Transaction,还有这个lock,还有这个叫lock with啊这样的三个表啊去做查看,呃,5.7当中呢,这呢就提到了,这个呢,就实际上就涉及到了我们后期呢,关于这个5.7之前,包括呢,我们8.0之后呢,做的一些改变的一些策略啊,这个呢我们也稍微说一下。嗯,在这个5.7啊,一直延续到现在啊,我们这儿呢,这不提到有三张表啊,这张表呢,我们目前呢还在使用啊,这个表呢还在使用,而后边这两个这个表的话呢,我们都使用了,诶叫做performance STEM啊相关的这个表呢,去做了一个替代。
15:14
比如说我们information STEM里边的这个表,我们就用里边的这个呢来替换了,然后这个表的话呢,就用我们这个表来做替换了啊,咱们在所里边呢,用到的其实是这个啊,用到的其实是这个好,那下边呢,相当于我们能给大家呈现呢,是不是实际上呢?呃,因为咱们在8.0里边去展示的啊,咱们要展示的话呢,是不是演示一下一个两个,是不是就这三个了。OK啊行,那这块呢,我们要想做演示的话呢,咱们也营造一个具体的场景啊,营造一个场景啊,你比如说我们在当前的这个啊,绘画的这个事物当中,咱们呢去select。啊,Select from,我们这个叫student,哎,咱们来一个呢,叫update啊,应该都能看得懂是吧?好,然后的话呢,我们回到这样的一个绘画的这个事物当中,哎,我们也去比begin一下啊,同样呢,我去写一个selecting from,我们这叫student,咱们也来一个呢,叫update啊,这里边呢,是不是就出现了我们这个阻塞的这个场景了是吧?好,那我们可以在这个位置啊,首先呢,我们先做这样的一个登录啊。
16:13
啊UP啊ABC123行这个呢,因为有这个这个时间限制啊,所以咱们还得加快这个执行啊,首先呢,我们来查看一下这个叫information STEM啊,这个里边的这样的一个表啊,回过来那我们就可以呢叫select。啊星来一下information啊,SIgMa里边的。来我们这样的一个表是吧,哎把它的CTRLC一下啊粘过来,哎来我们这块呢,去做一个啊这个咱们来一个杠G吧,来做个执行好这呢你会看到有两个信息是吧?啊那么这个信息的话呢,你会发现呢,是不是叫select from student for update,就是我们这时候呢,出现了这样的一个啊事物啊这里边这个事物啊,这个呢,想表达就是我们阻塞的啊,就是等待所的这样的一个事物啊,这样的一个SQL语句啊,你看目前的是谁啊,前面呢,对应的就是我们这个事物的这个ID。
17:03
啊,然后它目前呢,你看属于等待的,然后呢,开始这个时间是多少啊,下边呢,你看还有一个涉及到就是我们这个啊操作的话呢,它锁定的啊这个行数呢,你看是多少啊是吧,看看这块还有这样的一个声明啊。嗯,这呢是我们当前这个事物的一个隔离级别啊这样的情况啊,行这呢就我们看到的这样的一个信息啊展示啊,我这块呢,是不是应该到时了,那你看已经太冒了是吧,哎,这块呢啊这块还在等啊吧,就是因为呢,我们这个呢是查出来的,人家这个事物呢没有阻塞,这个阻塞的话呢,超过这个50秒了以后呢,他现在不就干停了是吧,那咱们这时候呢,再把它呢再跑起来吧。行,那么这呢,是我们查看的这样的一个信息,我们还可以呢,是不是使用我们这样的一个信息呢,做了一个查看呀。这里边呢,有一个小细节点啊,就是说呃,咱不说呢,这个表啊,被我们这个8.0当中的这个表呢给替换了嘛啊这里边有个区别点就在于如果呢,我们在5.7当中,你使用这个库当中这个表呢,去查看的时候呢,我们只能够查看到阻塞的这个事物啊,阻塞事物这个锁,如果呢,这里边没有阻塞的话呢,你是看不到的啊,你比如说我们这个当前的操作当中,呃,这儿呢,是相当于是有一个阻塞的对吧?然后我们这块呢,是不是这个呢,也有一个X锁啊,我们一个排大锁,但是这个呢,它是没有阻塞的,对吧?那么在5.7当中呢,相当于你就看不到这个没有阻塞的这个情况了,但是在我们这个8.0当中,我们是可以来查看这个,哎,没有阻塞的这样的锁的,那我就不去演示这个区别了,我就样一说就行啊就行,然后呢,这里边咱们到时候可以看一下这个信息啊回过来。
18:37
哎,然后呢,回到这儿啊,咱们呢去诶select星诶from一下,我把它呢就诶粘过来这呢咱们用这个杠这吧,诶方便来进行这个查看啊,诶你看一共呢查到有11行的这个具体的数据信息啊,具体我就不去分析了,就啊啊这是一个,然后呢下边这个呢,就专门来查看我们目前处于等待的这样的一个锁的一个场景。啊,下边呢,是不是所有的这个呢,是光查看这个等待的是吧,来使用我们这样的一个诶表啊CTRLC一下,那么回过来这时候我们可以呢去select。
19:07
啊行,然后呢,这个诶from一下,我们把它再粘过来啊,再来这个钢制板啊走起啊这时候你发现呢,没有了,诶没有等待的锁吗?诶这时候呢,是因为我们这呢,是不是又超时了,哎,咱们再把它呢抄起来,然后呢,此时回过来,你再把这个语句呢执行一下,哎是不是就有啊啊没有问题的是吧?哎这呢就针对咱们刚前这个阻塞的啊wait的这样的一个啊事物里边的对应的这个锁啊OK行,那具体这个细节的话呢,我就不一个一个的带大家去分析了啊然后呢,这里边主要用的啊,就是我们刚才说到的啊,这是一个表,这是一个表,这是一个表啊如果呢,我们通过上面的分析呢,发现你相应的一个等待的次数也比较多,时间比较长,你可以呢,再进一步的去分析啊,如果目前还有这个等待的一些啊,事物中的所得情况呢,去做一些查看,OK。啊,那么关于这一章呢,咱们就整个呢说到这儿啊,最后呢,我这块有个附录呢,诶是针对这个间隙锁啊,我们叫GAP锁呢,它的加锁规则啊,这呢其实也是结合网上的一些信息啊,一共呢提到了有11个这个大的案例,这块呢,我就诶放到我们这个附录里边了啊,就不一个一个带大家去过了,呃,如果呢,大家在开发中需要啊,用到我们这里边相关的内容啊,你这块呢,再过来翻译一下,我们这是一个案例啊就OK了。
20:17
好,那么这一章呢,咱们就告一段落。
我来说两句