00:00
好同学们接下来的话呢,我们来讲一讲这个叫行锁啊,那行锁的话呢,是我们讲到这个力度当中啊,最小的这个锁了啊,已经到这个行级别了,对吧?那由于呢MYS呢不支持行锁,所以呢,我们这里的行锁呢,就是针对的DB。行锁的话呢,也称为呢叫记录锁啊,因为一行数据呢,其实就是一个记录嘛,哎,顾名思义呢,就是锁住我们表当中的啊一行数据,那我们这个行锁的话呢,它是在这个存储引擎层呢实现的。啊,这个优点是什么呢?就是相较于我们前面讲到这个表索来讲呢,它的这个力度呢,锁定的这个力度呢,就会更细是吧,更小,所以呢,它可以实现呢,就更高的这个并发度,那降低了我们这个所冲突的这个概率啊,你比如说我们这个事故呢,你访问的是这条记录,我另外一个事故呢,访问的是另外一条记录,那咱们各自呢加锁,那其实呢,就互相呢不会影响啊,也不会发生这个冲突的问题。好,那么缺点是什么呢?缺点呢就是对于锁这个开销比较大,咱们前面也提到了,咱们要想去维护这个锁的话呢,相应的都会有这个开销的,那你这个力度比较小,所以呢,诶锁的开销就比较大一些,因为你锁可能会多一些,那加锁呢就会比较慢,而且呢,我们这个行锁的话呢,还会出现这个死锁的问题啊,这个呢是我们需要呢关注的一个点。
01:13
好,那么印DB呢,跟MY的这个主要区别呢,一个是事物,一个是这个机啊前面我们也都提到过了,那接下来的话呢,咱们就诶针对这个航呢,具体这些情况呢,咱们做一个演示说明,那么整体上来讲的话呢,我们又用到了一个新的表,叫做student的这个表是吧?那首先我们把这个表数据呢,我们做一个创建啊这个表的话呢,诶没记错的话呢,咱们之前呢,这个在当前的这个爱的硅谷DB3的这个数据库下呢,其实是有这个表的,对吧?啊这个时候呢,还是有很多的数据的哈,比如说我们先做一个这个呃查看啊这个count。哎,我记得咱们之前加的这个数据量还挺大的,那叫student。啊,你看这个查询时间呢,还是需要一点的那100万条数据,行,那这呢,咱们就把这个表呢,给它照不掉啊,咱就还用这个student啊,把它就删了。我这我这呢,使用这个job table啊student啊,OK,这就删除了,然后呢,我们按照刚才这样的一个需求呢,咱们把这个表呢,创建一下啊,首先呢,去create一个student。
02:11
哎,粘过来好走起诶创建好了,然后的话呢,我们往这个表里面呢,去添加啊,12345这样的五条记录。诶注意这里边这五条记录啊,我刻意的让他们的ID呢,是不连续的啊,中间呢,呃,是有间隙的对吧?啊中间是有间隙的,好,那么我们再去做一个查看啊,这个呢,其实大家也都比较清楚了,From这个student啊没有问题对吧,那我们在另外的一个这个绘画当中呢,咱们去做一个操作啊select。那行,那from我们这个student啊,没有问题的是吧?好的,那么在这个场景下呢,我们接着呢,去演示下边具体的这些锁啊,这呢是展示一个我们句子索引的一个简图啊,简图已经足够简了哈,然后呢,针对到我们具体这个叶子这个节点上啊,这个数据页上呢,我们有这样的几条记录啊,中间呢是有相应的一些间隙的,好,那首先的话呢,我们来看第一个呢,叫做记录锁啊,就是record locks。
03:06
啊,记录锁顾名思义呢,就是我们把这个呃锁呢,加到我们具体的这样的一个记录上,对吧?诶你比如说这块提到了,我针对于这个ID是八的这样一条记录呢,我就加了一个叫记录锁。那这个呢,你看lock record not GAP not GAP什么意思啊,就是我们不是下边讲的那个间隙锁啊,我们就是针对这一条数据加了个锁,那么我们加完锁之后啊,当然这时候我们家锁呢,还得说清楚,咱们前面呢,提到过的是不是有这个S型的,就是共享型的,还有这个呃,叫做这个排他型的是吧?啊,或者叫独占型的这个X啊类型的啊,那么这时候呢,跟我们前面讲的也是一样的啊,你要是呢,加的是这个S型的记录锁,那么对于其他的S型的记录锁呢,是没有影响的。对吧,是没有影响的,但是呢,你不可以呢,再去获取这个叫X型的这个记录锁了,那如果呢,你已经是获取了一个叫X型的记录锁,这是排他型的,所以呢,你就不能够再去获取呃,这个共享型的,或者说呢,其他的这个叫排他型的记录锁了啊一看呢,应该都比较清楚对吧?好,那下边呢,我们来给大家呢做一个这个演示啊,那首先呢,回到我们这样一个绘画层面啊,我们这时候呢,来一个begin啊,相当于我开启了一个具体的事物,对吧?那么开启了一个事物以后呢,我这里边儿呢,做一个update这样一个操作吧。
04:16
Update呢,我们叫a student。哎,Student的这样一个表,然后呢,诶我们去修改一下啊,这个set一下,比如说我们叫name呢,哎,Name呢等于啊叫做哎,比如说叫张三一是吧,然后where呢,这个ID呢,再等于一。相当于呢,我把这个ID等于一的这样一条记录的张三呢改成叫张三一是这意思吧,好,那么这时候呢,其实在这个上面呢,因为我们是一个增删改的操作啊,其实呢,就相当于给我们加了一个啊叫嗯,X型的啊哎这样的一个这个基录锁啊,或者我们叫这个行锁啊OK,那这个呢,加完以后的话呢,诶大家你看啊,我回到另外的一个会话当中,咱们呢,开启一个具体的事务啊,那么此时的话呢,诶,大家你想一下,我们现在如果想去做这个查询操作。
05:03
啊,你想我select行哎,From,我们这个叫a student没问题是吧?哎,然后呢,Where啊,注意关键看我们这个where啊,如果我这个位置呢,写的ID等于二,那ID等于二啊,咱这呢,写个比如叫for update吧。啊,这个相当于是加了一个X型的一个锁是吧,或者我们不加它,咱们来一个呢,叫lock啊音啊叫share啊,因为这个会更轻一些,对吧,M的好,那么我们在ID为二的这个基础上呢,我们想做一个查看啊,其实加了一个叫S型的这样一个锁啊可以吗?哎,你看是不是可以啊,哎,只不过呢,我们这个表里边是没有这个ID12的这条记录是吧,那你查一下三。哎,找一是三,哎这个呢就能查出来啊,这个是没问题的是吧?哎关键的大家你看一下我这时候呢,这个ID呢,你看我想查的是这个一,那这时候可以吗。安康走起啊,是不是这时候呢,就得发生了一个阻塞了,对吧?哎,这呢是一个S型的,然后我们这里边呢,是不是就是一个X型的啊,X型的这样的一个记录锁啊,所以这时候呢,就诶不让我们这时候呢去做这样的一个操作了啊这没问题啊,我CTRLC一下啊,终止一下我们当前这样的操作,好目前呢,还是在这样一个事务当中,好再接着来我们呢去做一个update的一个操作。
06:14
比如说update啊,我们叫这个student啊,没有问题是吧,然后呢,Set一下name等于啊,比如我改成了叫李四一啊,然后呢,Where。哎,注意VID呢等于三。诶,我把ID等于三的这条记度的这个李四呢改成理四一了啊,这时候我们去改没问题吧啊,你看我们走起是不是就改成了啊,那这时候呢,相当于我们加的仍然是一个X型的一个锁,但是这时候呢,这个锁呢,我们是针对于三来加的,那这个呢,是不是一样?哎,所以说呢,我们就不冲突啊,这就我们所谓的在行级别呢,他们这个并发性呢,这不就高了吗?啊那么患者啊,我这呢改成ID是一了啊,改成叫李四。咱换成张三吧。哎,张三。啊,张三,我们改一个这个三吧。
07:01
好,那么这时候呢,大家觉得能成功吗?啊,这时候显然是不是就不成功了,诶你看我们走起啊,因为呢,我们这边呢,是不是已经加了一个X型了啊,然后你这时候呢,回过来你再加一个X型的啊,针对我们同样的这一行记录,那当然就不行了呀。啊,不可以是吧,好,那么回过来啊,那如果说呢,我们此时呢,作为一个叫commit的一个操作,相当于呢,我们是不是就呃执行完当前这个事务,就释放了当前这一条记录的一个X型的一个锁了,哎,那我们这边呢,是不是就可以进行操作了啊,你看事实上也操作成了啊这时候我们可以呢,去select星哎,From一下这个student。啊,然后呢,我们去做一个查看吧,呃,这个呢,显然是就张三三啊,哎,没有问题,好,那这呢,咱们就把这个呃叫基录锁呢,其实就说清楚了啊,整体来讲呢,这个难度不大啊,难度不大啊,因为呢,大家呢已经清楚了,我们表级别的这个S锁和X锁之后啊,针对我们这个记录来讲的话呢,就是你要是针对的是不同的记录,那其实大家呢是互相不冲突的啊,你要针对是同一条记录了啊,那其实就跟我们前面讲的X所和X所呢,讲的那个规则呢就一样了,对吧?哎,这就可以。
08:09
好,同学们,咱们接着来讲这个第二种,这个行锁啊,叫做间隙锁啊,英文呢,叫做get lock啊间隙锁,诶这个间隙锁是干什么的呢?来来咱们这块一说呢,大家能明白啊,这个麦啊,咱们说在这个的这样的一个隔离级别下呢,说能够解决患族问题啊,咱已经翻来覆去说了好多次了啊,那么解决方案的话呢,一种呢,叫IVCC啊,下一章讲另外一种方案呢,叫做枷锁的方案。啊,我们上面呢,其实也讲到了,说两种这个方案了,对吧,那么这个加速的方案呢,说这块就有个问题啊,那么这个问题的话呢,其实我们在讲到上边这个并发问题的时候呢,其实就说到过啊方案1m macc啊这个呢是非常漂亮的解决方案,那么第二种方案的话呢,我们说加锁加锁针对这个幻读啊,哎,还记不记得咱们讲这的时候呢,说有点尴尬对吧?诶你像这个脏读也好,哎你针对的你要修改的这条记录呢,你就上面加个锁,不让别人去访问对吧?哎,你这个不可重复读呢,诶针对你现在正在读的这个数据呢,你加个锁就不让别人呢去修改。
09:06
对吧?诶这个都很好理解,因为你是实实在在的看到这个记录了,我们就可以上面给他加个锁,那你说这个换读,咱们一开始没有记录,后边人家插入以后有记录了,你说这块加锁你加谁呢。是吧,没有东西啊,它是幻影啊啊加了个寂寞是吧,哎,没有记录你就加不了锁,这加不了锁,那怎么锁啊,这块呢,就想办法,哎,我们这时候呢,就使用一种锁呢,叫做间隙锁。哎,叫做间隙锁,就是区别于我们刚才讲的说这个叫记录锁了,因为你没办法去呃加这个记录,因为人家一开始都没有这个记录,对吧,那这个间隙锁怎么去做呢?诶举个例子哈,诶比如说咱们这个表中的记录呢,是不是一三八十五二十对吧?好,那我们查看这个表中的记录的话呢,就查看到这些记录了,现在的话呢,其中一个事物呢,就是查这个数据查到了,然后另外一个事物呢,诶,比如我们叫B吧,他呢,就想往这表里边呢去加入记录啊,比如我们想插入三和八之间的这个数据。
10:04
啊,这个ID呢为4567啊都可以想插入这个数据,那我们现在呢怎么办啊,是不是就通过加锁的方式啊,让A这个事物呢,加个锁,不让这个B呢去插入这个数据是不是就可以了,那怎么办呢?诶这时候呢,我们就针对于谁呀。咱们可以理解成啊,针对这个八,我们就加上一个叫getp锁啊,就叫做这个间隙所啊,那么针对于八加上这个锁呢,其实我们想表达的意思呢,是在三和八之间啊,注意这是个开区间啊,在这个区间之内呢,我们不让你去插入数据。啊,不让你去注意,我说的只是插入出去啊,所以说呢,我们这个盖P锁的话呢,它仅仅就是为了防止我们插入这个叫幻影记录而生的啊,不让他去插入,进而呢,我们就避免了这个幻影记录是吧,出现这个诶换读这样的一个场景啊,就是这样的一个思录,诶这块呢,我们就说清楚了,这个监易锁的这个作用了,它的价值呢,就是它是吧,那么这里边的话呢,因为我们是防止呢,它在这个间隙呢,去写入这个数据了啊,去隐射这个数据了,所以呢,这里边呢,针对于我们共享的概P索还是独占的盖P索呢,其实就没有区别了,诶因为它不是针对于我们这条数据,诶就是这条数据你读还是写这条数据读过去,不是这意思,它针对是你这个区间中间的insert行为已经非常明确了,就是insert是吧,所以呢,这两个呢,共享呢,跟这个独占的就没有区别。
11:23
啊,就没有区别了,好,那下边的话呢,我们就具体的给大家呢,去做这个例子的一个展示啊来大家看,呃,我们在这个里边呢,咱们首先呢,来一个begin。啊,来个比begin啊没问题是吧,好,那么我们在这里边呢,咱们首先呢,对这个表中的这些字段呢,你得先清楚啊,然后的话呢,我怎么办呢,我这样子啊,我select from,我们这个student说where呢,哎,我这个ID呢,等于谁啊,我就写了个五,然后呢,首先我写一个呢叫lock。Lock的音啊,这个我们叫哎是哎,这个我先我先说一个这个事吧。我先说咱们一个复习的一个事儿啊,比如我这写的是个八是吧,然后我们叫lock in啊,Share mood啊,这个清楚吧。
12:06
这个应该清楚是吧,好,这个我们走起,这呢相当于我查出来这个事物呢,没结束好,那么同样的话呢,我现在把这个操作啊,我C啊insert我复制一下,这这是咱们一个复习啊,你注意听,然后我begin一下,然后呢把它粘过来,然后呢,我这来一个叫for update,大家注意,这时候你说我们能够查出来吗。是不行啊啊,因为呢,这时候呢,其实相当于我们演示的就是相当于这个,呃,一个是X锁,一个是X型的锁了,他俩呢,这块是冲突的啊,理解我这个意思是吧,好,那这呢,我就把它呢给停掉了啊,还在这个事物当中,这个事故还没结束好回过来,然后这个呢,咱们就来一个叫commit吧,那就提交了啊。好,然后我再重新再去比begin一下,注意现在有区别了,我呢,哎,写的还是这样的一个语句啊,我呢做一个复制粘过来,区别就在于我现在把这个八呀,我改一下啊啊注意看就一个微小的变化,我现在改的是五啊,五的话呢,你看跟八的区别就是八呢是实实在在存在的,我们加了一个S型的缩,现在我写的是个五。
13:03
啊,相当于要加一个继母是吧,啊你看这个呢,是怎么情况啊,我呢,走起。没问题吧,好,现在呢操作了,然后接下来的话呢,我把这个事儿呢,我再复制一下来回过来。啊,回过来的话呢,这个咱就重新开一个吧,啊,我比begin一下,然后呢,把刚才这个粘过来啊粘过来了是吧,然后呢,我写一个叫发布it啊大家你注意看我们呢,跟刚才的区别呢,维度就是我把这个八呢改成是五了,那你觉得我现在呢,要是回车哎,它会执行吗。大家看哎,你发现呢,是不是跟刚才的情况就不一样了,说怎么没有冲突呢,怎么没有阻塞呢?哎这个原因呢,就是因为我们家的这个锁呢,是不一样了啊,我们这里边呢,这个五在这个表中是不存在的。啊,你也可以理解成呢,就是我们现在这个数据中的一个间隙是吧?诶所以我们这时候加载的是一个间隙锁。诶,我们加的是个监易所,那既然是间易所了,我这块呢,是写这个这个结构也好,还是写这个结构也好,是没有区别的啊刚才我们在课件里边这不都说了吗?哎,他们俩是,嗯,在这儿是吧?哎,它们俩的作用呢,是完全相同的啊,那这时候我们意味着是什么呀?那就看我们这个五呢,是不是在现有的这个数据,你看哪一个区间之内,那我们明显的看到它是不是在这个三和八之间呀?啊,那我们要用过开区,原来表示的话呢,是不是就这样个意思。
14:20
啊,这样的一个意思是吧,好,那首先呢,我们先说清楚呢,就是我们这儿呢,加了一个呃间隙锁啊,这儿呢,是不是也加了一个间隙锁呀。对吧,哎,也加了一个监易所,那就相当于监易所呢,你是可以啊多次去加的啊,这个是没毛病的,那那么它影响的是什么呢?影响的就是比如我现在再开了一个绘画啊,在这个绘画当中,我们去引sert一下啊,但是你看啊,这个我们得先知道你这个表中呢,有这么几个字段啊,嗯,我这样盯一下吧,咱们有三个字段,好回到这样的一个绘画当中,注意看,哎,我这块呢,首先去比begin一下,然后我们in s into是吧。啊into我们这个student,咱们针对的ID name和class,哎,然后呢,Values,注意我这块我就咱们不写五了,我写个我写个六吧,就是三和八之间的啊,任何一个啊嗯嗯,4567啊都可以。
15:16
然后这个呢,我们比如说叫这个汤姆是吧,然后呢,Class呢就是嗯三班。哎,这么着是吧,好,那么大家你注意此时这条数据呢,其实就不能够,诶添加成功啊,你看我们走起,你看这时候呢,是不是就卡到这儿了啊这呢就是咱们现在这个钙不损呢,就起作用了。啊,就起作用了,是不是我们现在正占用着呢,你就不允许呢,去往里边去做隐私这样的行为。啊,清楚是吧,哎。站长,就是我们所说的这个叫盖布索,哎,它的这样一个主要的一个作用。啊OK啊行,那这块我们CTRLC一下啊,让他就停下来。好,这个呢就OK了是吧?好,那这样要说清楚之后呢,咱们回过来看一下啊,现在呢,咱们现有的表中的数据呢,是不是就到这个20这儿了啊一呢算是最小的,嗯,20呢算是这个比较大的,嗯,那我们呢,怎么着啊,咱们写一个,其实我这块呢,我刚才是写的ID是不是五啊,那其实你写五跟写六写七其实没有任何区别,就看你这个字段呢,它在哪两个数值之间,那我们就把这两个数值之间的这个数据呢,是不是就呃做一下建议锁就给锁定了,你就不能够呃填充这个呃4567是吧,这个数据,那如果说啊,我就说一下啊,如果说呢,我这个ID呢,呃,像刚才这个操作,我写的是这个12,那12呢,是不是就落到八和15之间呀?啊,那就意味着呢,我们开区间哈,八到这个15之间的,相当于九十十一十二十三十四这些数据呢,都不允许去做这个隐私这个操作。
16:44
啊,都不允许做这个隐色这个操作啊,这是OK的是吧?好,那么接着我们往后走啊,就相当于呢,现有的这些段呢,大家是不是都能够去理解啊,怎么呢去保证这个间隙是不允许的啊呃,那后边呢,哎同学说老师那20后边这个我们呃怎么搞定啊啊你比如说啊,咱们这块呢,就相当于是自己脑洞了是吧?哎回过来咱们这个时候呢,先把它呢做一个这个commit密的操作啊先把这个事误呢,咱都结束掉啊。
17:11
啊,这个呢,咱们也是做一个哎,Commit行怎么着呢?哎,我现在在这个里边啊,我呢去做一个begin是吧,然后呢,我去select啊行诶from一下,我们这个叫a student说where。啊,ID等于多少,我写一个25吧。然后呢,叫lock in share mode。诶是不是我这样写的呀,那么这样写的话呢,显然我们这个25呢,这条数据呢,在这个表中呢,也是不存在的啊,那么不存在的情况下呢,这是我们到底锁定的是哪个范围的数据呢?啊这呢,我只需要在这锁一次就行,就没有必要在这儿去锁了啊咱们这俩呢,其实是想演示的就是这个监易锁是可以共存的是吧?啊然后我们就还在这里边去演示一下这个隐私操作吧。啊,那么这时候呢,它会是怎么样的呢?啊,这个25的话呢,还有同学可能说那是不是就是25跟这个前面这个范围的呢,哎,前面这个范围呢,咱们最大的这个值呢,是20。
18:06
是吧,还有这个值值是20,那我们现在呢,先添加一个20~25之间的一个数据。啊,那比如说我们这呢,写了一个叫21。二十一来我们走起一下,好大家发现呢,是不是就不允许啊,啊不允许是吧,好,那这是我们把单呢停掉啊,那么你这块呢,写一个二十二二十三这个是不是同样的道理,肯定是也不行。啊,这个没问题的是吧,好,这就相当于我们呢,去硬去测试哈,那刚才呢,是不是一个25啊,那我这块呢,我要写这个26呢,啊,你看行不行呢?哎,走起。啊,你看这种呢,是不是也不行啊。二六也不行。是吧,26也不行,好,那我们这块呢,也把它停掉,那我们再来试一个是一个20之前的,那20之前呢,咱们比如说这个17。啊,在咱们这个表里边呢,这个20之前呢,是这个15是吧,哎,我这块写个17啊,看看允不允许啊凑齐。啊,17呢是可以的。是吧,17是可以的,那么我们能够看到呢,就相当于是咱们现在呢,加的这个呢,是25是吧。
19:04
嗯,写哪了?哎,这个25我们写25啊,咱们这个最大这个值呢,呃是20啊,那么我这个25呢,是在后边呢,相当于呢,是不是我们写了一个,呃这个范围呢,就有点类似于我们相当于是,呃20呢,是这里边的嗯头了,然后但是我们写了个比它还大的,那你坐落的这个空间呢,相当于区间呢,是不是就从20起一直到正无穷了呀。啊,那么刚才我们也测试了,从二十一开始一直往这块呢,都不行,但是前面的话呢,是允许的。哎,是这样的一个意思吧,好呃,那么这个时候的话呢,我们通过一个啊参数咱们做一个查看。啊,我们通过这样参数来我做一个查看啊,CTRLC一下,然后这个参数的话呢,咱们刚才是在这儿来演示的是吧。啊,这个呢是插入成功了,嗯,在这看也行啊,我们把它粘过来,哎,我们回车好,这个呢大家去看一下说呢,我们刚才这块呢,针对于这里边呢,相当于是不是加这个叫间细锁了是吧?那这个间细所呢,它是怎么个加法呢?诶你往下走啊,其实这里边呢,大家你会看到我们这有一个这样的一个写啊一个一个声明是吧?哎,这个声明呢,你这个词呢,认识吗?
20:12
咱们前面呢,是不是讲过啊,在一个呃页当中。嗯,我的图呢。嗯,在下边。嗯,在啊在这上面啊。图呢?记录所啊,间隙所。啊啊啊,没有图啊,在这儿呢,啊行呃,大家记得咱们原来讲这个数据页的时候呢,说在一个页当中啊,诶你比如说我们这个页里边呢,就这样几条记录,实际上的话呢,它前面是不是还有一个呢,叫in free nu是吧?诶这个呢,就是我们指向这个最小的这个记录了,然后这个20的话呢,诶它是不是就会指向我们这个叫,诶那就是我们现在这个最大值的一个记录,那其实这里边的最大值呢,目前就是20了。那我们这块呢,写了一个25啊,这个25呢,它做了的区间呢,其实就相当于是呃,在大于20的这个区间之内,所以呢,把它呢就当成是一个下界了啊就相当于我们这种写法呢,其实就是呃这样的一个范围,他给谁去加的这样一个叫间隙呢啊,其实就用到了我们这里边看到的这个啊这样一个词。
21:18
啊,这样个词就可以了,行呃这呢,就我们给大家演示一下,我这写的是25啊,那你也可以写呢,比如说ID大于20啊,只要是ID大于20的,那其实这时候呢,我们都可以,呃,体现的就是从20到正无穷的这样一个范围,加了这个诶间隙索拉。啊,能够理解是吧,啊能够理解啊好,那这块呢,咱们把这个事物呢,咱去做一个提交啊,然后这里边呢,咱们也去做一个提交啊把这个事儿呢,我们就先给大家结了啊现在结了,然后的话呢,咱们再给大家演示下一个问题。啊,下个问题我们说呢,这个间隙锁呀,它有可能会导致这个叫死锁的问题。诶它可能会导致死锁,诶这个呢是什么情况呢?诶咱们就还以这两个来说啊,诶我们呢,再去开启一个begin,然后呢,再去做一个select,那这个我们就用一个五吧,好开启了没问题是吧?好,那我们在这块呢,咱们也去做一个begin。
22:12
啊,然后呢,咱们也去再执行一个针对五的叫update啊,相当于这呢,都加了一个啊叫间隙锁是吧,加完以后的话呢,你看这时候呢,其实他们两个就互相影响了哈,那如果说我们在这种场景下呢,咱去啊在你这个事物。呃,第二个里边呢,我们去隐私into。啊,咱们这个叫a student ID name。啊,这个叫class啊Y64好,那么这时候呢,我们不能够写三跟八这个范围之内的,那我写个七吧。哎,我就写这个范围之内的啊,它就相当于会产生这个阻塞啊,这个我们叫Jerry好,这个呢叫一般。哎,一般诶是这样一个情况是吧,好,你看这是我们去做这隐色的操作呢,是不是它就会产生阻塞,他的阻塞的原因呢,是因为我们另外一个事物啊,这块我们是不是有一个叫间隙锁呀。
23:05
没问题是吧,所以他在这块阻塞着,好那么在这个场景下呢,诶我这块呢,我再复制一下,回到我们前面这样一个,诶绘画当中,我这块呢,把它粘过来啊,这个你不一定非得要是写其老啊,写个六是不是也都无所谓。好,大家呢,你发现呢,你看我这块一回车的时候呢,诶这块呢,它出现了一个错误的信息啊,这里边呢,我们称为呢叫做deadlo是吧?说呢,我们这有一个死锁的问题呢,发现了说当我们试图去获得一个锁的时候啊,让我们呢去重启这样一个事物,对吧?哎,首先的话呢,我们说这里出现了一个死锁,怎么来理解这个死锁呢?呃大家呢,如果呢,你学习过像Java里边的这个,呃多线场的话呢,这个死索问题呢,你应该是比较清楚的啊大家你看啊,我们这个事物里边,呃相当于什么呀?诶它这块有一个这个间隙锁是吧?然后在这个事物里边呢,也有个间隙锁,它锁定的都是这个三到八这样的一个范围,然后呢,我们在第二个这个事物当中,咱们有一个隐私操作,呃,也恰好呢,是这个范围里边的一个值,呃,现在呢,其实就不让我们去这个添加,是这块呢,它是在一个阻塞的这样一个状态当中,是吧,那么我们现在呢,在这个。
24:10
第一个这个事物当中呢,咱们也去做一个隐塞的一个操作,也是在这个范围之内,那正常来讲的话呢,是不是它也应该是一个阻塞的呀?啊那么为什么阻塞呢?我们这个阻塞呢,是因为你在这个事当中呢,我们不让你去做这样的一个插入,而我们这个阻塞呢,是因为你在这个事物当中有一个不让他执行的这个这个操作是吧?诶那么他呢,就僵持下去,那么我们要想解开这个事儿的话呢,必须呢,呃,比如我们这个呢,想结束阻塞,是不是要保证我们这个事物当中呢,这个这个间隙锁呢,得释放了才行是吧,但是呢,他释放不了,为啥呢?因为你这块停着了,导致我们这个事物呢,就没法往下去执行,你去这个commit呀,还是roll back的呀,只有他发生了以后呢,我们才能解,它解了才能它才能解,它解了以后呢,我们这个呢才能解,而这个解的话呢,它才能解啊这呢就一个死扣了啊,发现了没有。对吧,诶发现了没有是吧,这个死扣了,所以导致呢,就是他们两个呢,要想能够结束这个阻塞状态呢,都得是让对方的这个事物呢,得往下执行,而现在的话呢,是不可能的,哎,这个呢,我们就称为呢是一个死锁的问题。
25:12
啊,是个死索问题啊,这块也明确呢,告诉我们呢,确实是一个死索对吧,那这块发生死索了啊这个你看他这块呢,却没有僵持在这儿是吧?那我们看一下另外这样的一个事物呢,诶但是你发现呢,他竟然执行成功了,很神奇是吧?诶这个怎么会执成呢?哎,这个原因呢,主要是因为咱们这个MYSQL当中,它关于这个死锁的一个处理的机制问题啊大家你看这有个死锁是吧,那一旦呢,我们发生死锁之后呢,呃,那么默认情况下呢,就是双方呢互相僵持着,诶但是呢,我们不能让他真正在这去僵持着啊那怎么办呢?诶这个我们处理策略呢,第一个就进入等待状态,直到呢,我们这个超时了,超时以后的话呢,他们就都分别的就结束了。啊,那么这是一种策略,另外一种策略的话呢,就是发现死锁的检测以后的话呢,我们会主动的回滚死锁链条当中的某一个事物啊,主要呢,就是找这个持有的航籍排查所,呃,事物呢进行回滚啊,最少的这个航籍排查所就找个成本最低的啊,那我们从这个结论上来看的话呢,相当于。
26:14
啊,这个呢,要执行成功了,那就相当于咱们这个当中呢,是不是它进行了一个事物的回滚操作啊,他做了一个事物的回滚操作以后呢,来导致我们整个这个呢,相当于它就释放了这样的一个间隙锁了,是不是使得我们这里边儿呢,这个操作呢,它就能够执行成功了呀。诶能清楚是吧,诶这就我们看到这样的一个结论啊,这样一个结论行,那么这个事儿的话呢,咱们一会儿呢,还会再去说啊,讲到思索这块还会去说,大家呢,目前呢,需要关注的点呢,就是我们这个间隙锁的一个作用是什么,以及呢,诶就是我们可能会出现在航机锁层面呢,出现这个思索的问题。啊,也不管我们这个建议所会出现了啊,其他位置呢,也可能会出现,只要是行机所都有可能出现,表所呢是不会出现的啊,这个大家注意一下。
我来说两句