00:00
好,同学们,咱们接着来讲下一种这个行机锁啊,叫做临键锁啊,这个一看这个中文的话呢,好像完全摸不着头脑,咱们看这英文呢,叫做next key lock。啊,看完之后呢,好像也好不到哪去啊,啊也是看不懂啊,这个呢,非常简单啊,一句话呢,给大家说清楚,就是这个临建所啊,就相当于是我们这个记录所和这个间细锁的一个合体啊,既体现了这个记录锁的作用,又体现了这个间隙锁的作用,你看咱们讲这个间隙锁的时候呢,大家很清楚了,比如我们这块呢,把这个三和八这个范围之内呢,给它加上一个间隙锁,相当于呢,就是三和八这个范围内啊,开区间里边不让我们去隐射它这个,呃,其他这个记录是吧,诶间隙锁呢,不就是影响我们隐射的这个数据嘛啊那么这个时候呢,咱们三和八呢,都是开区接,那说能不能把把这个打成一个B区间呢?当然这个B接呢,并不是说呢,我们再添加一条记录呢,说这个值呢是八啊,这个不是这个意思,而是说呢,我们间易锁呢,影响的是这个开区间的范围,这个八的话呢,能不能也让它呢,诶这个不能够这个实现,比如我们这已经有一个X锁了,你就不要呢再去整这个X锁或者X锁了,相当于把这个八这个数据呢也给它锁定。
01:08
啊,不光锁中间的这个区间啊,间隙还能锁我们这个边界啊,那这呢,其实就相当于我们的这个叫诶临间所。啊,你看这写的也比较清楚,说有的时候啊,我们既想锁住某条记录啊,又想阻止其他事物呢,在该记录的前面的间隙呢,插入新记录,那我们就起了个名叫做na key locks。啊,不知道他为什么这样起这个名,总感觉这个很诡异是吧?呃,因为从这个名字当中啊,咱们完全看不出来它是具备这样的一个特征啊,这个官方的名称呢,叫lock ordinary啊,呃,简称的这个叫nice lock啊,那就这么叫吧,啊,这个翻译成中文呢,叫做这个临建所啊,就这样一个概念。好,那么这个零件锁的话呢,它是在这个印DB当中,这个repeat这样一个情况下呢,使用的这个呃,数据库的锁,那印DB的默认的啊,就是使用的这个这个lockx,所以呢,咱们在上面呢,去演示这个记录锁,演示这个间易锁呢,你发现呢,都能够演示出来这个效果,就是因为呢,它用的是这个啊零件锁啊间距的上面这两种特征,好呃,那么这也说了,就是他俩的一个合体啊,所以这样一说呢,就比较清楚了,呃,那这块呢,咱们给大家呢具体做一个演示啊,比如我们在这个层面。
02:17
啊,不管前面这块呢,事物呢到什么层面了啊,咱们都把它呢做一个提交啊,这块呢,咱们也,诶不管前面三七二十一,我们都先做一个事物的提交,诶我们重新的去开启这个新的事物,OK,这块呢我们写一个begin对吧,然后的话呢,我们去做一个select星,然后呢from一下这个student,然后呢,Where啊我这样写啊咱们现在呢,假设呢,就想把这个呃八这个数据呢,现在给大家锁定,然后呢再锁定三到八之间的这个间隙啊那这时候怎么处理呢?哎,我们可以这样去做啊,首先呢,我这个ID呢,注意你别小于八啊,我们要小于等于八啊,那这样的话呢,诶,我比如说加上一个叫哎。诶,我比如说这个叫for update吧,诶相当于这时候呢,我们就进行了,嗯,比如说等于八的话呢,你你相当于就是一个呃,锁定这个范围内的每一条这个记录了,对吧?呃,当然这个呢,不管光看这个操作的话呢,不管我们八八小小的这些数据呢,我们现在也做了一个,呃叫这个记录锁是吧,但我们再加一个条件啊,我这呢叫and啊ID呢再大于三啊,那么大于三和呃这个小于等于八呢,这个范围内的话呢,诶我们好像就都是一个间隙的。
03:24
啊,那只有这个八呢,有等于相当于我们针对八呢,就做了一个叫做记录锁啊,那么这个三和八这个开区间之内呢,其实相当于就是间隙锁。啊,能理理解意思是吧,所以整体上呢,就构成了我们一个叫零间所啊可以了啊,那么哎哟,这里边我们有个问题哈,咱们那会儿呢,是不是往里边插入了一条数据哈,这个数据是七。啊,那这还不行了啊,那这还不行了,那那咱们换一个例子啊,明白我的意思是什么是吧,咱们再换一个啊,比如我们这块呢,考虑是这个八跟15这个范围之内的啊,那咱们换一个就行啊,或者换一个之前呢,咱们先这么着吧,我先select形from一下我们这个student,咱们先看一下这表中的数据。
04:03
好,那这块呢,咱们就拿这个范围呢来说吧,那OK,那首先呢,我们做一个begin啊重来啊,因为上边呢,我们有个七呢,这个事儿呢,就就就不太对了,呃,Begin以后呢,我们首先呢去select星from我们这个student。啊,然后呢,Where啊这个公民这个跟上面其实是一个意思啊,我们这个ID呢,是不是叫小于等于15啊哎,然后and呢,我们这ID呢,是不是大于八就可以了,然后呢,我这块呢叫update啊理解是吧?啊那么这时候呢,就相当于是我们针对于这个15呢,进行了一个叫记录锁,然后它俩范围内的这个开区间,相当于就是一个间隙锁。好锁住了,锁住以后的话呢,我们回过来。好在这个里边呢,我们写一个比例啊,然后呢,我们首先呢,你看一看,针对于15这条数据。啊,它这块呢,其实已经加上了一个叫啊叫什么,是不是这个X这个锁了啊,那我们这块你看能不能去读啊,哎,我们去select from student啊where ID呢等于15啊这个呢,我们ID等于15,哎这个咱们加上一个叫S锁吧,叫lock in啊share mode是吧?哎,走起,那这个呢,相当于是不是发生了一个阻塞行为了,那这个呢是合情合理的,对吧?啊,因为我们这是个X啊这呢是一个X啊就不行了,这些呢,你要是给它写成是一个for update,那更不行了。
05:23
啊,其实也无所谓,这个叫更了啊,就总之呢,诶对方呢,已经是这个叫排他锁了,这块你共享的排他的做白扯啊都不行。啊,OK,能理解行,那这呢是体现呢,我们叫这个记录所的情况啊,然后呢,我们再去呢,往里边去做一个insert啊,Into,这个叫student ID name,还有这个class是吧,然后value,那此时的话呢,我们就考虑一个就是八跟15范围之内的一个数,比如我们就写一个12吧,啊,这个我们叫一个team。啊,班级啊一般。很一般。
06:00
哎,这么着是吧,然后这个时候呢,如果说它也是阻塞了,是不是就体现了我们所谓的叫这个间隙锁这样一个效果,对吧?来我们走起,那是不是也卡到这儿走不动了,好,我们这块呢,给大家就暂停了啊行,我们这把这个事物呢,就提交一下啊,那这呢,咱们就相当于把这个事呢,就给大家呢去说清楚了。啊,说清楚了啊,就是我们这个叫,哎,这个叫临键锁啊,间距上边这两个的特征啊,就完事好,那么下面的话呢,我们看一看,这个叫做插入意向锁。啊,这个英文的话呢,当然很清楚啊,叫insert啊,In,呃,Intention啊,这个lock啊,这个呢,就是意向的意思,好,那么这又是一个什么锁呢?啊,其实我们前面的话呢,有过这样的场景。啊,有过这样的场景,那就是呢,当我们有一个这个间隙所的时候。啊,有一个这个迁易所的时候啊,其实又回到我们刚才说的这个场景了,那我们直接就在这块给大家说吧,咱们刚才已经提交这个事务了,那咱们就直接直接呢往下面去再开启一个新的一个事物,好那么这个时候呢,我去叫select星,诶from这个叫a student说where呢,这个ID呢,等于我去写个12吧。
07:08
哎,咱们刚才那会插入12呢,没插入成功是吧?哎,这个注意是没成功的啊,或者你要不保险呢,咱们先这个select一下。没问题是吧,好,那这个时候呢,我们去做一个这个select。这时候这个sla的话呢,我写谁呢?哎,我写咱们这个ID呢,就等于12。叫做这个间隙锁呀,哎,走起啊,诶我们这儿呢,做了一个间隙锁啊,这个还还不行是吧,这个呢还我我重来吧,咱们得加上这样一个,呃,你是一个X所还是一个X所,这个忘了加了啊嗯,这么着吧,咱们先这个commit,咱们得先做一个begin啊啊先begin,然后呢,我们把这个等于12呢,这个咱们加上一个叫for。诶for update啊OK,好,执行相当于我们这块呢,是不是针对于这个八到15这个范围呢,我们相当于是有一个叫间隙锁,是这意思吧,好,那么接下来的话呢,我们在这个里边啊,咱们呢还是做这个比begin,然后呢,我还是做这个叫隐私的这样的行为,只要呢是在这个八到12之间,八到15之间啊,其实用哪个都行啊,包括刚才这个12呢,其实也可以啊,我这样呢,一回车是不是就考到这儿了啊,这个呢,其实就是咱们刚才提到的是不是这个间隙锁的一个效果没问题吧。
08:20
OK啊好,那么在这个情况下呢,我们说啊,这个事物它在等待啊,那么等待的这个事物呢,我们说也让它有一个啊锁结构啊,也让它有个锁结构,就是我们这里边儿的这句话。啊,这个咱们往下找一下这个呃,插入一项锁啊,这块呢,提到的说呢,阴DB规定说事物呢,在等待的这个时候呢,也需要在内存中生成一个锁的结构。啊,也需要生成一个所在结构,那么表明啊,有事物呢,想在某一个间隙啊,插入一个新的记录,但是呢,只不过现在呢,是处于一种等待的状态。啊,那这时候呢,我们给这个,呃,插入的这个锁结构叫什么呢?就是你又插入这样的一个意图的一个锁,所以叫插入意图所。
09:04
啊就是这样,相当于呢,就是针对于咱们刚才的啊这个嗯,哎呦看这块呢,相当于给我们目前这个时间比较长呢,给我们这块呢,给停掉了哈,诶你知道这块这个事儿哈,就现在的话呢,诶,它相当于是一直在这个阻塞的状态,我们就给加了一个锁。啊,那么这个锁的话呢,就叫做插入意向锁。这个插入意向锁的话呢,一定要明确,它可不是一个意向所啊,看着名字上面有一个意向,它可不是意向所,那意向所呢,它是个表级所,你注意咱们这个插入意向锁呢,你是不是就针对我们这里边的这几项数据做的这个行为,它呢是一个GAP锁。哎,它也是一个概P锁啊,是一个行级锁啊,这个大家一定要小心一点啊,是这样一个行为,嗯呃,那么这里边呢,关于这个插入意向锁,它为什么还要引入,说这个你等待的时候呢,也要这样一个锁结构呢啊其实这里边就提到,就是说我们一旦呢,你对应的这个啊,我们回过来哈,一旦呢,我们左边的这样的一个间隙锁呢,它要是这个消失以后啊,释放以后,我们这个呢,插入一项锁呢,相当于它就有机会呢,是不是就进入一个执行状态啊,诶所以呢,就让我们这个隐私的操作呢,它就能够执行了。
10:09
哎,就是这样一个意思。啊,就这样意思好,那么这一个情况,然后呢,我们还是想呢,再接着说另外的一个场景啊,这块他给我们自动停了啊叫太out了啊,咱们重新的把这个事儿呢再给他,呃,这个呢,其实没结束啊,咱们再走起来,我呢再去执行一下,你看这个呢,处于等待状态是吧?诶他这呢就相当于有一个叫插入一项锁好,然后呢,我们回到这个啊另外的一个绘话当中啊,咱们再去啊,我也比跟一下,然后的话呢,我过来。啊,我把这个语句呢,哎,复制一份啊,然后回过来啊,我们粘过来,哎,这个时候呢,我们稍微的哟。嗯。啊,这个呢,我我CTRLC一下啊,这个因为它这块呢,有这个分号了啊。重新再再粘一下。啊,这个我们到这儿是吧,诶CTRL,哎,这个复制一下啊。嗯,这个叫interrupt啊行,这个我们就,哎呀这个还真是各种的这个特殊情况啊,这个不管了,我们就先了啊,哎,我重新的在这去做这个begin啊,然后呢,我们把这个呢操作呢,给它执行一下啊先复制。
11:13
然后呢,再粘过来,然后走起啊,是不是就在这阻塞呢?是吧,这有一个叫插入一向锁好,然后呢,我们在另外一个绘画当中啊,这个我也不管前面怎么着了,我就也是先commit一下啊,然后begin,然后呢我们把它呢也粘过来,这个时候的话呢,咱们可以给它改一下啊,我改成是另外的一个12,还是在我们第一个的这个。啊,这个监隙锁这个范围内啊,八到15这范围内,好,那么此时的话呢,我要是也回车的话呢,是不是显然也是有一个插入一向锁,现在是阻塞,诶主要呢,都受到我们这个间隙锁的一个影响,对吧?诶那我们现在呢,想提到一个什么问题呢?就是这两个啊插入一项锁它俩之间呢,是什么关系呢?啊是这种这个互相影响的关系吗?阻塞的关系啊,兼容不兼容的关系啊,其实我们说呢,他俩呢,你看因为改动的具体的这个值呢,是不是不一样啊。
12:01
一个是ID11个是ID12,哎,所以他俩呢,其实是兼容的啊,这就意味着一旦我们把这个所呢,咱们做了一个释放之后啊,你看我们这时候呢,做一个commit是吧,哎,我们走起啊,那么这时候呢,他俩呢,是不是就都可以考虑去正常的去做执行了。啊,这个说超时了哈,啊这个就执行了啊,这个正好这个时间呢,在我们这个允许的范围内,呃,这个范围这个外了哈,超时了,其实大家应该能理解啊,就是诶我这块呢,就因为提交的比较晚了哈,诶我就不再去演示了,我们这块去做提交的时候呢,因为你已经结束这样的一个监计所了,然后所以我们这两个呢,其实是都可以的去执行成功的啊,那么就是说我们这个诶插入意向锁他们之间呢,诶实际上呢,是可以有这种兼容的这样的行为的。啊,我们这呢,还画了这个对应的这个锁结构啊,第一个的话呢,就相当于是我们刚才这块演示的第一个这样的一个事物啊,它呢是一个叫间隙锁对吧,然后呢,针对我们第二个事物,第三个事物呢,他们俩都是叫插入意向锁。
13:00
啊这用这针对这个插入行为的啊啊他俩呢都获取所失败了,就由于我们这个监狱所的存在,然后一旦我们这个啊事务呢结束以后啊,他俩的话呢,呃,只要他俩也没有冲突啊这个插入意向所跟插入意向所之间呢,诶没有说呢,是一定会有冲突行为的啊这个呢是ID11,这个ID12,所以他俩呢就都可以呢去考虑执行成功。啊,就这样个情况啊啊另外呢,这块也提到了,说插入一项锁呢,并不会阻止别的事物呢,继续获取该记录上的任何类型的锁啊实际上呢,这块呢,这个事儿呢,大家不用去死硬背啊,只要呢,你能够理解说诶他们应该是矛盾的,他们应该是不矛盾的就可以啊我觉得这个你呃这个因为这个结构吧,都是人来设计的,你看我们讲了这么多的锁是吧,啊结构都是人来设计的,只要你觉得它应该是合情合理的,那基本上它也就是这样子的。啊,你就比如说我们这个ID是11,这个ID12,你觉得他俩会冲突吗?显然不会吗?哎,那他事实上呢,他就是不会的啊,因为你也是正常人啊,设计这个结构的也是工程师,他也是人,所以他就会这样去设计啊,他比我们强的点呢,就是他的实操性比较强,他确实做到了,而我们呢,可能只有想法,我们没有实现而已,是吧?好,那么这样的话呢,咱们就把这个航机锁啊,这个行锁呢,咱们就说完了啊,那整个来讲的话呢,大家需要呢,自己下来呢,来实操一下,包括我们这个表锁,那你光听一听的话呢,没有实操,这个还是差点意思的啊,自己呢也亲自呢去写一写啊,OK。
我来说两句