00:00
好,同学们,咱们接着来看这个第三个这个表级的锁叫做自增锁啊,Auto increase啊这样的一个lock,嗯,首先的话呢,这个锁呢,它毕竟是一个表级锁,所以呢,咱们这块呢,从完整性上来讲呢,还是要讲一下它的,那其次的话呢,就是我们在设计一个表的时候呢,通常呃,针对于主键啊,咱们说呢,在实际业务当中啊,非核心的表,我们确实呢,是可以用这种叫automent啊这样的方式呢去诶给我们这个主件呢,去设置这个值,让它去增长的,对吧?诶就我们实际呢,在创建表的时候呢,会有这样的行为,那基于这些点的话呢,我们来给大家讲一下这样一个锁,哎,那么但是的话呢,就这个锁大家整体上来讲啊,作为一个了解就可以了。啊,一个了解就行。好,那么大家看这里边呢,我们创建这个表啊,这个表里边呢,ID这个字段呢,是auto inment的,这个没问题是吧?然后呢,我们往这个表里边呢,去添加数据,添加数据的时候呢,我们就可以过掉这个主件啊,我们只考虑这个name这个呃,字段值的一个赋值就行,那么ID这个字段呢,它会自动的帮我们去做这个赋值的行为,对吧?诶这个大家都能去理解啊,那么此时的话呢,我们说呢,其实我们针对于这个自动赋值的这个行为,那你想想,如果我们有多个不同的这个事物。
01:12
啊,多个不同的事物呢,都去做这个隐塞的行为,我们要保证你ID这个字段负的这个值啊,它是不是应该是UN的是吧?呃,那么最好呢,还是这个单调递增的啊,对于我们去生成这个必加数的结构呢,是有好处的啊,那么这时候的话呢,我们就涉及到了关于这个字段啊,它上面呢,其实会有一个锁啊,那么这个锁的话呢,就是我们这里边提到一个自增所啊,因为呢,它不是针对于某一行数据呢,起作用是针对这个表的啊作用是吧,所以呢,我们就是表级别的这样一个诶自增所。那么这里边呢,首先我们要想说清楚呢,这个具体的个锁的一个使用情况呢,我们先要明确一下,咱们插入数据的三种不同的模式啊,有同学说,诶这个原来没想过这个事儿是吧?诶其实呢,我们可以归结为三种模式啊,那分别对应的就我们这三种啊简单的插入啊,这个呢叫批量的插入啊,这个叫混合的一种模式,什么叫简单的插入呢?呃,就好比是呢,我们使用这个叫呃,Insert啊然后呢,Values,那不管呢,你是这样一条一条记录写values,还是说呢,像我们这种呢,Values后面写了多条记录,这个呢,都算是这种简单的。
02:17
那么批量的这个行为呢,对应的就是我们可以呢,去写叫insert什么,然后select等等等,那就是我们在上篇呢讲到的说基于现有的表,我们去添加数据的对吧?哎这样的行为,那么这两个呢,为什么把它拆成两个不同的情况呢,因为我们这种简单插入的情况呢,其实大家呢,在我们这个SQL语句当中。你是能够明确看到我们要插入的这个行数的啊,你比如说我们这个是不是一看就知道插入两条数据啊,对吧?那如果说之前我们也没有插入过数据,那这个auto equipment呢,它就默认从这个头部开始,相当于我们这的负ID呢,不就是一个一,一个二,或者至少你知道呢,是不是需要它占用两个ID的值就可以了,所以呢,他知道这个数量,对于我们这种的话呢,事先呢就不知道你要插入这个行数了啊,你比如我们隐私的到某个表select形from另外一个表啊,过滤条件呢,你可能还加了,那咱一开始都不知道你到底能查出来几条数据,进而呢,你再插入到我们这个表当中,对吧?所以这个呢,就事先呢不知道要插入这个行数啊,这样的场景好,那么第三种呢,称为叫混合模式。
03:16
啊,混合模式呢,你看就长这样啊,我们into到这个表当中啊,我们这里边呢,明确的把这个ID呢,逐渐写出来了,然后value的时候呢,有的情况呢,我们写这ID值了,那你就不要呢,给我再去付了,有的人又没有写,没有写的话呢,是不是就需要自动的给我们去付这个ID值啊,这就属于这种混合的模式。啊,混合的模式OK。好,那么针对于我们上边这样的呃,三种模式呢,我们下边呢,去提出咱们这个叫自增锁,就是专门呢给我们这个主件呢,诶赋值的时候啊,我们要确保呢,它是全局唯一性的是吧?呃,这里边我们提到这个锁说它呢是向啊包含有automent这个表中插入数据的时候呢,呃,需要获取的一种特殊的表里锁,然后一个事物在持有auto in crek啊啊in cre这个锁的过程当中,其他事物的这个插入语句啊,都要被阻塞。
04:06
啊,这是个表里锁,就是谁拿到这个锁啊,那么谁就去操作,那么其他的这个事物呢,都需要阻塞,因为我防止呢,这个数据呢,相当于会出现呃,非unique的这种场景,对吧。好,接着当我们像一个有automent关键字的这个主键呢,插入值的时候呢,每条语句啊,都要对这个表所呢进行竞争。都要进行这个竞争啊,谁拿到了谁就来操作,所以这时候呢,它这个并发性啊是比较低的啊,那基于这种并发性呢,我们就可以考虑呢,来设置不同的这个锁定机制啊,来一定程度上提升它这个并发性啊,三种模式,第一种模式呢,叫做传统的这种锁定模式,对应的就是我们这个值呢,是零的这个时候。啊,那么这个所谓的传统模式呢,就是我们这个auto increase是吧,这样的一个锁呢,它这个表级别的,然后大家呢,都去争抢这个锁,哎,都去争抢这个锁谁拿到呢,那是又来操作啊,所以它这个并发能力呢,是比较差的啊,这是传统模式,那么当我们把这个呃,属性啊,这个变量这个值呢,设置为一的时候,它表示的叫连续的锁定模式。
05:08
那么这个连续锁定模式呢,是我们8.0之前的默认的一种这个呃,这个这个叫什么添加模式哈,它这个时候呢,我们说呢,如果你要是这种叫呃什么呀,批量的插入这个模式啊,因为呢,你批量插入的时候呢,我们也不知道你事先呢到底要插入多少行,所以呢,他还是需要呢去抢我们这个呃表里锁的啊,他需要去抢,但是对于我们这个叫简单的这种插入模式来讲啊,因为我已经事先是不是知道呢,你要插入多少条数据了,所以说呢,诶那么我们这个简单的插入模式,如果对应的啊,他这个对应的是一个事物的话呢,如果这个事物呢,抢到了这个表极所了,诶他呢一次性的会申请,比如说我这块呢,知道要插入失效记录,诶,我就申请这个,诶十个这个值就行了,然后紧接着的话呢,它其实会释放关于这个锁的一个锁定。啊,那么他释放以后呢,他这块该添加就添加,然后其他的这种,比如说诶批量插入的这种模式啊,这个时候呢,你再拿到这个锁呢,你去啊一个一个去加啊,你可以握一段时间,而他呢,就只需要呢,诶握一下就行啊,握一下就行,然后握一下完了以后呢,你添加呢,可能慢慢加就可以了啊然后这个锁呢,别人还可以再去拿到。
06:14
当然了,这个前提是什么呢?是你得先握到这个锁,你要是别的这个,比如说批量插入呢,呃,这个呢,事物呢,握着这个auto increase这个表解锁呢,你现在虽然是一个简单的一个插入,但你也要等他,诶把这个锁释放以后,你能拿到了以后,你才能一次性的申请多少个值。啊,这个大家注意一下,相当于呢,我们一定程度上呢,能够比上边这个并发性要好一点,但是整体上还差点意思是吧,然后呢,在8.0当中呢,又引入了一个叫交错的所的模式啊,就是这个二的一个场景啊,那么这个时候的话呢,我们说所有的这种啊隐色语呢,都不会呢,使用这个表级的叫auto increase这个锁了,那这个时候我们现在这个并发性呢,就大大的提升了。啊大大提升了我们整个呢,其实需要保证的就是我们这个,诶主键这个值呢,首先它得是唯一的,然后呢,诶最好呢是单调递增的,这一时候呢,你中间呢,会不会是连续的,其实我们并不关注对吧?诶并不关注,那么在我们这个简单这个模式下啊,简单这个插入模式下呢,诶它其实呢是可以保证呢,是一个连续的啊没有间隙,是对于我们说的这个混合的这种模式,或者这个批量的插入的这种模式呢,它都有可能会存在这个间隙。
07:19
啊,那这种情况呢,其实就会导致呢,我们如果是主动复制的时候啊,Blog这个啊,这个相应的这个文件当中,我们涉及到这个主件呢,它可能就会有一个不安全的问题。啊,就是任何事物呢,有利有弊嘛。啊,它这块呢,主要的优点呢,就是提高了我们插入数据的一个这种并发性,啊,这个并发度呢高了。行,那这呢,就是咱们针对的这个叫表级别的啊auto increase这个锁的一个讲解啊,大家呢,整体做一个了解啊,哎,做一个了解就可以了,知道呢,诶确实呢,这是一个表级别的锁啊。OK。好同学们,咱们接着来看关于这个表极锁的最后一个啊叫做原数据锁,这个呢,在咱们讲到一开始这个表所的时候呢,其实咱们提到过这个原数据锁对吧?诶那么范范来讲呢,就是说虽然咱们提到呢,说这个印度DB呢,支持叫行机锁了,那是不是说我们这个印度DB里边呢,这个表锁就没有了呢?呃,实实情况呢,大家会发现呢,除了我们提到的第一个叫表级别的S锁和X锁之外呢,我们这个因入DB当中啊,像这个意向锁呀,自增锁呀,原数据锁啊,其实都是存在的啊,都是存在的,咱们平时提到了说这个MYS跟印度DB呢,他们一个支持叫表机锁,一个支持叫航机锁,主要呢,其实咱们的区别呢,是在于第一个啊,这个大家呢,去注意一下啊好,那么针对于我们说这叫原数据锁呢。
08:36
我们说呢,DB当中呢,它也是存在的啊,它存在的这个场景呢,就是我们在这个一开始的时候提到过的啊,说当我们呢,对一个表呢,在进行这个增删改查操作的时候是吧,那如果说呢,另外的一个事物啊,或者叫一个线程呢,对这个表的表结构呢,进行了变更了啊,比如增加了一列或者少了一列,那么这时候我们查询这个操作呢,就会对不上啊,查询这个数据呢,跟我们表结构呢对不上了啊,这时候呢,可能就会出错了啊说白了就是呃你这个呃另一个线程呢,表结构的一个修改呢,相当于是一个整个表级别的一个修改了,那会影响到其他这个啊增长改查这个操作。
09:12
那么怎么办呢?这个时候呢,我们会针对这个表啊说呢,你要做增删改查操作的时候呢,我们会给你加上一个叫MDL的一个读索啊,叫做原数据锁的一个读索,那么你要是对这个表结构进行变更的话啊,是al也好,诶兆也好等等啊变更的话呢,我们会加一个叫MDL的一个写锁。啊,一个是毒索,一个是邪锁,那么这个呃,毒索跟毒索之间呢,他们是哎不互斥的啊,就是可以两个同时呢去读啊,这是没问题的啊,但是呢,你这个呃写索的话呢,这块呢,是只要有写索存在,那就不能够去读啊,以及呢,你不能再去别的呃这个事物呢再去写啊这个是不允许的啊,这个大家要注意一下。注意这块我仅针对的是这个MDL啊来谈的啊雨同呢说说老师你这块刚才提到说你这个表呢,嗯,这个进行了一个测然改查的操作呢,是叫读索,那我另外呢,又有一个自然改查,我还是个毒索,这两能共存不是说呃这个自然改不,呃这个自然改不行嘛,注意我们是从这个MDL这个锁这个级别来谈的啊,毒所跟毒所之间呢,是可以这个不互斥的啊,是这样个意思啊,那至于说呢,你要是真正责然改的话呢,你看另外一个责然改,你是这个不能同时执行了啊,是这个阻塞的状态的,那不是因为我们这个锁导致的,你是因为这个你相应的这个呃,行的这个级别的X锁和X锁呢导致的是吧,这个大家注意一下啊,好,那么这个锁的话呢,其实注意也不是需要我们显示的去添加,诶只要你做这个操作呢,它会自动的帮我们去做这个添加的,好,那么回过来呢,我们做这个演示。
10:44
那这呢,我们比如还是针对这个T恤这两个表是吧?嗯,这一块的话呢,我们上边这块呢,提交了没有,好像没提交哈,咱们提交一下行,那么最后的话呢,我们,呃,首先呢,去开启一个事物,开启一个事物之后呢,我们这时候呢,先去查一下咱们这个表中的这个记录啊,比如说我们去查询这个星,哎from这个叫a teacher,哎这呢就相当于我们查询这个表中的这个记录数了,哎这个没有问题是吧?好,那么在他这个开启的这个情况下呢。
11:14
嗯,解锁了行,我这块呢,重新呢,开启一个事物啊,然后的话呢,我们做什么操作呢?比如我们的al一下这个table啊,我们叫这个teacher。啊,Table呢,这个teacher,然后I啊相应的一个字段,比如我们叫age啊叫in类型的,好,我们这是回车,大家你会发现呢,此时你看是不是就阻塞到这儿了啊,就是因为呢,我们此时呢,要加上一个叫MDL的一个叫写锁了啊但是我们前面呢,是不是已经有一个MDL的一个读索呀,啊这个读索呢,它是自动给我们加的啊读写呢,这时候呢,它就。呃,阻塞了啊,就过不去了啊,就是我们说的这样的一个场景啊,那么有同学会想说,老师是由于我们刚才说这个MDL的一个所造成的吗?好,你看啊,我在另外的一个这个诶会话当中,咱们呢,可以使用一个指令呢,叫收呃,Process list。
12:02
哎,这样的一个指令,好,大家你看在我们这个指令当中呢,哎,我们就看到了咱们当前那个啊,我们不是要做这样个操作吗?哎,Waiting for table的lock啊,这不就是MDL这样一个锁嘛,哎,是不是看的非常的清楚啊,OK啊行,这呢就是我们说清楚了这样一个场景。啊OK了,行,呃这呢,就我们说的这个MDL这个读索这个呢,对应的是写锁好,那么再说一个事儿,呃,我们刚才提到了,说你要是这块呢去读啊,如果说不存在我们这样一个行为的话呢,我们要也再开一个读,是不是没有问题啊。那这个需要我再去演示一下吗?啊打一个吧,来我们这块呢,CTRLC一下,我给他停了是吧?哎,给他停了啊呃,那么在我们当前这个事务当中,其实你也没有这样一个操作了,行,我们在这块我呢去比begin一下。啊,没问题是吧,然后呢,我起select行from一下我们这个teacher。嗯,T是吧,这样子好大家看到我们这时候呢,相当于也加了一个MD2的一个读索,这呢也是MD2的一个读索,它俩是没问题的啊,你看挺好,相当于呢,这个读跟读呢之间呢,是可以这个并发执行的,好注意看啊呃,我们在这个执行的时候啊,我把这个呢先暂时咱们先给它来commit一下啊。
13:14
这个结束了吧,在我们当前这个MD堵索呢,没有释放的情况下呢,我再把这个al table啊,这个呢给它加上,那是不是仍然呢,这块呢是一个阻塞状态,这个清楚是吧,那么在这个阻塞的场景下啊,但是你再看一下我另外的一个事物啊,咱们呢去比begin一下,然后呢,我再去执行刚才的这个select的星来走起好大家看。啊,知道我想刻画的意思是什么吗?啊,就是本来呢,如果只有两个MD这个读索的话呢,我们是可以并发执行的,但是呢,呃,由于我们这里边呢,有了一个MD这个读索,然后呢,你又加了个索啊,这个斜索呢,就由于它的这个出现呢,我们也就阻塞了是吧,那现在你又加了个毒索啊,这个毒索呢,跟它是这个可以并发执行的,但是你这块呢,跟这个MDL这个斜索这块呢。啊,因为它的这个啊出现啊导致呢,我们现在呢,这个毒是不是也阻塞了呀。
14:05
啊,这呢,就是我们这个MDL。啊,他的这个所呢,呃,这个并发呢,对应的这个问题啊,相当于呢,此时咱们呢,有两个毒的行为呢,他现在呢是不能够并发执行的了,哎,降低了我们这个并发的这个性啊,并发性给降低了,好这呢就是我们想给大家强调的这样的一个问题啊,大家呢,要注意一下这个场景啊好,那这块呢,咱们还是把它这个复原一下啊,然后我这块先停一下,咱们做一个commit啊方便呢,咱们后边做测试啊,咱们把这个该停的都给它停掉。他都听到那这个我commit一下是吧,哎关键呢,就是这块呢,我们这块做一个commit个操作那就可以了啊行,那这呢,就我们提到叫MDL啊这样的一个表级别的最后的一个锁,OK。
我来说两句