00:00
好同学们,咱们接着呢再讲另外一种呢,哎这个锁的分类方式,哎我们呢称为呢叫按照加锁的方式来进行的划分,哎,那分为呢叫做显示锁和隐示锁啊,那可以理解为呢,就是前边呢,凡是我们通过诶相关的一个指令啊,就比如我们这个指令,咱们能够查看到的诶这些相关的锁信息,那都叫做显示所,那隐视所呢啊隐视所洋外机呢,就是你查不到了是吧?哎这就叫做隐示所,这呢我们是泛泛的一个理解啊,那么这个隐视所呀,它主要指的就是针对于我们呃,事物当中的这个隐色的这个行为。那是不是这个事物当中隐私行为都是叫做隐士所呢?哎,这也不对啊,这也不对,那这块呢,我们就先要回顾一下,咱们在讲到这个位置之前啊,哪些位置呢,我们提到过这个隐私这个行为啊,注意听。啊,这块呢,关于隐士这块呢,稍微的有点这个难度啊,这个隐色的话呢,我们在之前的两个位置呢,提到过啊,大家你看是不是一个呢,是我们在讲这个读索写索的时候呢,提到这个提到过这个写操作,这个写操作呢,就是说增删改对吧,那么关于我们这个增的话呢,诶叫做隐ser,诶这个位置呢,其实说的就是我们这个叫隐视锁的事儿啊说呢,一般情况下呢,我们新插入一条,其中呢是不需要加锁的。
01:14
啊,就是我们针对一个事物当中啊,比如说这是我们这个,咱算是这个一个表吧,是吧,里边呢,有这样的一条记录啊,是我们通过这个叫事物一添加的是吧,那添加完以后的话呢,这块你这个事物结束了,那就结束了啊这个数据呢,正常来讲我们是不需要加锁的啊就是说的这个意思。呃,但是的话呢,我们又会呢,通过呃加一个叫隐食锁的结构啊,来进行呢,对这条数据的一个保护啊,为什么要保护呢?因为可能有别的事物呢,会去访问它啊,所以呢,我们要做个保护啊,大家呢,单独看这句话呢,会觉得有个矛盾,说呢,前面提到了说不加锁,怎么后边呢又说了有个叫隐世锁。是吧,呃,感觉上呢,是有这个矛盾啊,那么这块呢,我们一会儿呢去细讲啊,咱们现在的理解呢,是这样子的啊,我们可以这样去看,就是一开始的时候呢,我们如果这个事物一呢,把这套记录添加完了,你再做几个别的事儿,然后这个事物呢就结束了,那这个时候呢,我们就理解成了是没有锁的了。
02:07
啊,但是的话呢,我们在这个事务一还没有结束的情况下呢,有可能别的事物呢就进来了,比如这个事二。这个事二进来以后呢,他就想访问我们insert这条记录啊,那么具体这个访问行为的话呢,我们分为呢,叫增删改啊,还是叫呃这个查是吧,相当于就是一个读是一个一个是写啊,那如果说你要让这个书二呢去读我们这条记录了。啊,我这个事物还没结束了,你去读了,这其实是不是就个脏毒问题啊,对吧,那你要是呢,让这个12呢去,呃,修改我们这条记录了,这不就是发生一个脏血的问题了嘛,哎,我这个事物可是没结束呢,对吧?啊,那这时候呢,相当于我们会有这个并发访问的一个问题啊,那么为了呢,去限制其他这个事物呢,对于我们这个隐色这条记录呢,呃,这个产生这种并发访问的问题,那我们呢,就要给它加一个隐食的锁。啊,其实大家呢,能看到就是这个隐视所啊,它实际上是一个延迟加载的啊,就是受到别的事物影响的时候是吧,要访问的时候呢,我们才加的啊,这个呢,我们称为呢,就是一个隐视的一个行为。
03:07
从这个相对来说这个官方上来看啊,就是关于隐视所这块的理解上呢,呃,确实还查了查这个官网啊,像其他我们提到这些所呢,官网都有介绍,那么关于这个隐视所呢,其实介绍呢,就是呃文字内容呢,就相对来说少一些啊,他关于这个隐示所的一个解释呢,更多的倾向也就是我们在这条记录上呢,有个隐示的列啊,咱们知道每一条基录上是不是都有一个这个叫传财神ID是吧?哎,只要呢,这个ID呢,记录了这个数一啊,就把这呢就当成是个隐视所了啊,就他这也相当于是有点含糊啊加个引号。啊,大家知道这个事儿啊,一会儿呢,咱们详细的去说这个过程啊,先放完这样去理解,就是我们加他的目的,你注意一下,就是为了防止诶别的事物呢,在我们当前这个事物呢,没有结束的情况下呢,访问导致并发问题是吧,哎,加的这个锁。好,这呢是我们说的的,诶这种场景啊,也就是我们现在要讲的这个隐视锁的这种场景,那么还有一个位置呢,我们提到过的insert是不是就在讲这个叫插入一向锁的时候,对吧?好这个场景呢,跟我们现在说的隐视锁啊其实不一样,所以我们要把这种情况呢,先剥离出来,这个情况呢,就是我们在有这个叫间隙锁或者叫呢,呃,临间锁的这个情况下啊,你比如说就针对于我们这个呃三八是吧?诶在这个范围内啊,这呢我假设是一个概P锁了啊,你要是这个零间锁的话,你就把这个八呢,比如包含上是吧,就这个意思,在这个区间范围内呢,如果我们去ins射一条这个记录。
04:26
那么此时的话呢,我们说是针对于咱们这个银色的这条记录呢,呃,相对应的我们就会加一个叫插入意向素。对吧,诶这叫插入意向所,注意这个呢,是在我们有这个,呃,这个临间所或者叫间隙所的这场景下,我们这时候呢,出现的这个插入意向所,跟咱们现在呢,要刻画的这个呢,是另外的一个事儿。就相当于你这个呢,是不是一个被动的,是人家先有这个呃间易锁了,然后你这块呢,你想插入是吧,而我们现在呢,是不是主动插入那位置呢,对应的没有这个间计锁或者叫零间锁的存在的啊,我们这时候呢,才叫这个隐视锁,好先在我们把层层这块呢,呃,问题的点呢先梳理清楚,然后下边呢,我们来看一看这个隐视所这个细节。
05:05
啊,这个细节好来看啊,所以呢,如果一个事物呢,想插入一条记录啊,这个呢,就是没有别的这些其他的事物的干扰哈,就是我们现在很干净的呢,想插入一条数据了,在这个事物当中,那么另外一个事物呢,此时想访问了,那访问呢,无外乎呢,就是毒的行为和写的行为,对吧?那毒的行为的话呢,我们说呢,又分成呢,诶给这个查询操作呢,我们加了一个S锁,就是lock in share是吧,叫S锁,你也可以呢,给这个读的行为呢,加上一个X锁,就是排打锁,叫for update。啊,那这时候呢,如果你要是让他读了怎么办呢?那就是脏毒问题啊,那如果说要去修改这条记录呢,就是我们呃,隐私的这条数据的这个记录是吧?那这时候呢,诶,你要是让他去,首先呢,你会针对于你这个事物啊,咱们是这个叫事物一吧,事物一里边呢,你是隐S射的,然后呢,事二里边,你如果想去修改我们事物一里边隐射的这条记录啊,相当于你呢,呃,加了一个X锁叫排打锁,你要让他做了,那这块就是个脏写的问题啊,刚才我们也说到了,对吧。
06:00
好,那么这时候呢,我们该如何呢去限制啊,如何呢,去体现我们这个隐私的行为的这个隐视所呢?哎,这块呢,说对应的两个场景啊,其实主要呢,我们先说这个场景一啊,呃,那么大家注意啊,咱们的事物一当中,把这条记录呢,我们比如说也叫记录仪吧,添加到我们这个表里边了,那是不是一定会在我们的句子索引的叶子节点中某一个页当中体现你这条记录啊。对吧?哎,就是我们一个行记录了,那么我们说对于一个行记录来讲,咱们也讲过行格式了,它有三个隐藏列啊,那一个呢叫入ID是吧?啊一个呢是我们叫trans ID,就是我们这个事儿啊,另外一个的话呢,就是叫回滚指针对吧?哎,我们讲这个安度这个页的时候呢,提到过。好,这个unlo的时候啊提到过啊,这个我们这时候呢,主要是看这个叫transaction这个ID啊,然后呢,我们是事务一呢,添加了你这条记录,我这个十五一呢还没有结束,那么此时的话呢,这个船赛山地呢,其实记录的就是你这个十五一。啊,就是我们这个11这呢,就假设是我们这个数据页了啊,或者你叫诶数据表也行,这个呢是11过来的,OK啊此时的话呢,我们理解呢,就是没有这个,诶其实所谓的这个啊,这个叫隐藏列。
07:10
啊,我们叫这个隐视隐啊,啊没有这个所谓的这个隐视所啊,说错了啊,这是我我这样来去给大家解释哈,那其实官方一点呢,他怎么说呢,他就把这个,呃,当前你这个事物一呢,添加的这条记录,然后你这个位置呢,记录的也是这个事物一,他这时候呢,就把它说诶这就叫隐式列。啊,这就叫隐视锁啊,就这个意思,嗯,其实我觉得有点牵强啊,但是大家你也可以这样理解,它就叫隐视锁了,那就叫隐视锁啊,反正咱们如果呢,去通过这个指令呢,去查看这个表中有哪些锁的时候,你是看不到的是吧?啊隐示了嘛,啊好加个引号啊这样理解好,那么然后的话呢,呃,现在我们另外的一个事务二呢,现在进来了,我想去访问。诶,我想去访问的话呢,诶这个时候呢,大家注意看啊,我们怎么去操作呢,不管你是呃这个读的行为也好,还是写的行为也好啊,诶如果一旦发现啊,我们当前的这个啊,隐私的这条记录的这个事物呢,还是活跃的啊,因为我们这个事物一是活跃的啊,如果是活跃的话呢,那我们就得干什么呀,说白了就是人家是活跃的,你这时候你就不能够去操作了。
08:15
啊,你就不能够去操作啊,那不能够去操作的话呢,那这时候怎么办呢?注意这个事物二的话呢,它会帮助我们这个事物一构建一个锁结构。你看你注意听啊,我刚才说的是事物二帮我们这个事物一啊,构建一个锁结构,这个锁结构当中,诶我们提到了是不是有这个叫哎is waiting是吧?这is waiting这样个属性,然后呢,诶你这个十五一的这个is waiting这个属性呢,它就是个false,相当于人家目前是个活跃的,然后呢,你再给自己提供一个锁结构啊,然后呢,你自己这个is waiting这块呢,是不是就改成true啊,那YIG呢,就是你自己呢阻塞一下。哎,你自己阻塞啊,那如果说呢,我们这个呃12呢去操作它的时候呢,这个事物一呢已经提交了啊,那你这时候呢,就你就不是这个for,呃出了你就是false了,你直接可以改是吧?或者说呢,我们这个事物一呢后期呢,诶它这个结束了,结束以后的话呢,你这个十五二呢,就把这个is waiting呢改成false,你就可以呢去操作这条记录了,这样就避免了我们所谓这种并发的问题。
09:15
啊,这个应该我说清楚了是吧?好,那么这儿呢,是我们针对的啊,你是通过这个呃,叫主件的这样方式的话呢,我们去找到的这条记录,那用户的话呢,是不是这个事二也可能会去通过是不是我们非主见的这样索引去找到这条记录啊,因为我们正常添加一条记录这个字段呢,通常都是完整的,那么除了在你这个巨速索引当中去体现这条记录之外,是不是也有可能在其他的二级索引当中去体现这条记录啊。啊,你比如说其中有这个字段,你按照这个字段加了一个二级索引,那么你会在二级索引当中是不是啊,也能够找到这条记录的一个存在,那么如果说你这个12的话呢,就是通过这个二级索引呢,这块找到的,那你就得去看我们这个情景二了。啊,就得看这个情景二了啊,那这时候呢,就有个问题哈,就是我们刚才提到的说你这个叫transction ID呢,它是在我们这个行记录里边啊,提了供的,而我们这个行记录化完整的是不是只存在于我们这个居溯索引里边啊。
10:09
对吧,啊,叶子节点中啊,那我们二级索引当中其实是不存在你这条记录的完整的记录信息的,那就意味着我们就没有这个叫trans ID了。那怎么办呢?诶注意这时候呢,我们当前这个叶啊,不管你是二级索引也好,还是这个呃句子索引也好啊,我们说都有叶结构是吧,当然呢,我们在这个二级索引的这个页里边啊,它会呃在这个页的这个叫配置header里边。啊,在这个配置里边呢,它会有这样的一个属性。啊,这个属性来CTRLC一下啊,大家说那个我都忘了,哎,你可以看一下我们讲这个数据存储结构的时候啊,这是我CTRLF啊CTRLV啊,咱们粘一下,你看在这时候就出现了是吧,仅在二级索引当中,我们定义一个这样的一个结构啊,叫配置max trans30id,就是修改当前页的这个最大的数ID。啊,就在这儿呢,去有这样的一个变量啊。好,那么呢,就是虽然你在这个二级索引当中,没有我们这个航记录里边这个传塞占地了,但是你这个页里边呢,有一个这样一个属性,它就记住了,就是对当前这个页呢,做修改的最大的是ID了。
11:10
啊,这个是Y地好,那如果说我们这个事物一呢,现在你在这个页中插入一条数据了,那自然而然啊,不管你这个事物一呢结束没有啊,你这个事物一呢,其实就会记录在我们这个页当中啊页当中,那如果说呢,我们现在呢,呃,这个另外的这个十五二呢进来了啊,他这时候呢,会拿这个十物二的ID呢,跟我们这个页当中的这个啊这个属性的这个值呢,去做个比较啊去做个比较啊,那如果说呢,我们这个值呢会更大啊,这个值呢会更小一些,那此时就意味着你之前的这个事物呢,都已经提交过了。啊,那我们这时候呢,就可以去做操作啊,那如果说呢,不满足这种场景,那就意味着我们当前这个事务一呢,它还啊事务一呢还没有结束啊,那怎么办呢?那这时候你就通过我们这个二级索引呢,找到我们的这个主键索引,然后呢,再回到我们技术索引当中,针对这个传塞ID的这种场景,看看没有加这个相应的这个表结构的话呢,你去给人家提供一个表结构啊,就又回到我们这个场景一的这种啊情况下。
12:06
啊OK行,这个呢,说的就比较绕一些啊,这是一些细节行为啊,那对于大家来讲的话呢,其实我们在开发当中啊,大家接触这个影视所的机会呢,其实是比较小的。啊,其实比较小的啊,但是呢,既然我们讲的内容呢,咱就把它呢说透啊说透行,那下面呢,就是一些具体的一些描述信息了啊,一些描述信息了啊。说这个隐视锁呢,在内存中啊,实际上并不含有这个锁信息啊,因为它隐示的我们通过这样的一个指令呢,你想去查看,你是查看不到的啊,这个大家要注意一下啊,嗯,这块呢又提到了一个,说这个影视锁呢,是一种延迟加载的机制啊,其实就是我们这块提到了你有另外一个事物二呢去访问啊,才使得我们这个锁呢出现了。啊出现了,所以呢,你可以理解成呢,叫延迟加载啊这样的一个方式啊,延迟加锁的方式,你也可以看成是呢,这个时候呢,我们12的这个访问呢,导致我们这个影视锁的出现啊,其实这时候一出现呢,它其实也就变成一个显示锁了,我们也可以通过这个指令呢来查看了。
13:05
啊,这个有点绕来,我们下边呢,就给大家举个例子来演示啊好,我们在这个当中呢,咱们去use一下艾特硅谷DB3啊好,那这时候呢,我去begin啊,开启一个具体的事物啊,这个我们就做一个insert这样的一个行为啊,那inser这个行为咱们先呢去select清from,这个叫a student,哎,我先做一个这样的一个查看啊好。好,那么接下来的话呢,我们去insert。那叫into啊,这个叫student,然后呢,我这写个ID,写个name啊,写一个class,然后values啊,然后这个呢,比如我写一个叫啊,这个你就随便写就可以了啊,现在的我们这个表中呢,咱们没有任何的锁啊,所以呢,呃,不是这个有建易所的情况下呢,你这个插入一项所啊。哎,我就写一个,比如说二吧。啊,然后这个我们比如叫Tom啊,这个叫哎负个值啊一般。哎,这么着是吧,好,那这候我们走起,哎,相当于我们现在的话呢,呃,就插入成功了是吧,那么在这种场景下啊,你比如说我再换到这个位置吧,咱们也去登录一下哈。
14:09
MY。好,或者就登录成功了,那么在我们当前这种场景下呢,咱们先通过这样一个指令呢,去查看一下啊,我们这里边儿呢,有哪些这个锁啊,有哪些这个锁是吧?好,那我们这块呢,诶回过来啊,在这儿呢,我们去执行啊走起好,大家你会发现呢,是不是没有任何的锁出现。对吧,OK啊,然后呢,接下来的话呢,哎,我们呢,再回到这个啊绘画当中,哎,那我们也是去use一下,还得硅谷DB3。好注意看啊,那我呢去起一个事物,然后接下来的话呢,我们去select啊行诶from一下啊,这个我们这个student,然后针对这个查询操作呢,你不管是加S锁还是S锁啊都不行,那么比如我们加上一个S锁吧,啊lock音。哎,Share啊mode,哎是不是这样个情况啊好,那这时候我们选中了,诶执行,哎当然你会发现呢,你看现在呢,我们是不是就阻塞在这。
15:06
啊,阻塞在这儿啊,那这时候的这个阻塞行为,其实就是由于我们这个位置呢,呃,隐私的这条记录呢,还影影响的啊,那其实呢,刚才你不是在这儿看到没有锁嘛,那现在的话呢,我们插入的时候呢,他也不让我们插入,那就意味着这时候是有锁的,那时候有锁的话呢,我们再去啊执行一下这个指令来走起啊,当然你会看到了,此时就是我们这个隐视锁。啊,就能看到他了。啊,那这时候既然你能看到它了,其实我们也就可以把它看作呢,这个隐示所呢,现在现身了啊,变成了一个显示所啊,可以这样去理解啊。行,那这个关于这个研所呢,咱们花了很多这个笔墨呢去描述哈,哎,那其实呢,在开发当中呢,大家理解这个事儿就可以了,那除此之外呢,剩下我们能够显示的啊,通过刚才这个指令能够查看的呢,这都叫做显示锁啊,比如说我们前面呢,加上这个lock in share的这个X锁,或者呢叫发update啊,排锁的这个X锁啊,都OK的。行,那反而这块呢,是我们的中心啊,那咱们前面讲的其实都是这些场景啊,这就过了啊,这个呢,就是我们给大家重点强调了一下这个影视所。
我来说两句