00:00
好,那么关于锁的第一个维度我们进行划分的,咱就讲完了啊,这个呢还是比较重要的啊,大家呢,一定要去体会,我们这里边讲的这个叫X锁,叫共享锁和这个X锁叫做排查锁啊,或者叫独占锁,这两个的这个区别,OK,然后接下来的话呢,我们再从第二个维度上去看,就从数据操作的力度上来去进行划分啊,我们分为呢,叫做表极索,这个力度呢,就是越来越细哈,表极索,然后呢一级索,然后呢叫行索啊行呢已经是我们可以操作数据的是不是最基本的一个单位了啊,那就锁的力度呢,就非常的小,好,那这呢,大家应该也很清楚啊,我们要想提高这个数据库的这个并发度的话呢,我们是不是锁定的这个数据范围呢,就越小,就越好啊,你比如说呢,我们这里边呢,操作的是这个ID呢,等于五的这条记录,那你这一个事物呢,操作的是它,然后我们加了一个行锁是吧,那么我们另外一个事物呢,人家操作的是这个ID为七的这样一条记录啊,那这时候呢,诶,你要是加的行锁的话呢,是不是就不影响我这个事物呢,去操作ID为七,现在这个并发性呢,不就更好嘛,但是你要说呢,你操。
01:00
的是同一个表,哎,我们加了一个表锁,那你这时候呢,如果十五一呢操作这个表加了个表锁,那我们这时候呢,十五二呢,想去操作这个表的话呢,是不是就有问题了。对吧,啊,这里边儿呢,当然是包括这个呃,写的行为的啊,你要都是毒的话呢,当然呢就是兼容的了啊,这里边儿呢,至少有一个呢,是出现这个写的行为了啊,咱们现在谈的这些呢,是不是就是这个既有毒又有血的这样一个场景啊。对吧,诶这个大家注意一下哈,好,那这呢就提到了我们说这个呃并发度,并发性跟我们这个呃力度的一个问题哈,说这个要想提高这个并发度呢,我们这个呃锁定的范围呢,就越小越好,但是呢,这里边就有个问题,我们锁定的范围呢,越小的话呢,这时候呢,对于资源的消耗呢,其实就会越大一些,比如涉及到我们去获取啊,检查呀,释放啊,锁这样的一些动作,所以这里边我们就要达到一个平衡,就是呢叫高并发的一个响应,和我们整个系统性能的啊一个平衡。啊,这个并发度越高啊,对性能的要求呢就越高啊达到一个平衡,所以呢,我们就产生了一个叫锁力度的一个概念啊,那么这个力度最大的啊,这个就是我们说的叫表极锁,或者叫表锁,对整个表呢去加的锁,那力度呢越细,并发度也就越好,然后我们呢,最小的力度呢,就是我们这个叫行锁对吧?啊业绩锁呢,是介于它俩之间。
02:13
好,那么我们给大家讲解的话呢,咱们就先来讲这个叫表锁,然后呢,咱们再来讲这个行锁,然后页锁的话呢,我们最后来说,那么表锁这块呢,我一共罗列了四个,哎,咱们这个呢,首先呢,进行一个整体上的说明。好,那么表锁的话呢,它会锁住咱们整张表啊,这呢也是MY工呢最基本的一个锁的策略啊,它呢不依赖于这个存储引擎,就是不管你是什么存储引擎的,这个表锁的这个策略都是一样的啊,就是对整个表我们加个锁啊,这种呢开销呢是比较小的啊,显然呢开销很小是吧?啊,因为它力度比较大啊嗯,这种呢,就是我们这种情况呢,是能够避免死锁的啊,那很显然你把整个表呢都锁住了,你说你这个。嗯,咋会有这个死锁问题呢?是吧?诶那么后边我们讲这个行锁的时候呢,就会有这个死锁的问题啊好,那么这是我们说的这个场景,然后的话呢,它的这个问题是什么呢?就是开销小,但是呢,它这个并发性的话呢,就会差一些啊毫无疑问嘛,对吧?行,那么下边的话呢,我们来谈一谈这个叫表级别的这个X锁和这个X锁啊,咱们上面不是提到过这个共享的和这个叫哎排他的是吧,或者叫独占的这个锁。
03:17
好,那么我们说呢,这个一般情况下呢,咱们呃,就是in DB啊这呢又提到了in DB和这个MYS它的一个区别啊,In DB的话是支持行几锁的。啊,这个MY的话呢,只支持这个表锁,所以咱们如果用的是这个DB的话呢,通常咱们就不会选择呢去使用这个表级的这个S锁或者S锁了,因为呢,我们可以选择力度更小的这个行级锁是吧?诶这个大家注意一下啊,但是的话呢,我们说呢,在有一些场景下的话呢,我们还确实啊,即使你用的是这个硬的DB啊,我们也需要呢,诶使用这种表级别的一个锁啊,只不过呢,不是咱们这S锁和这个X锁了。总感觉有点绕啊,说绕口令似的啊啊这个大家你看我这写了一段话啊,这个呢,其实就是咱们一会儿呢要讲的这个叫原数据锁。
04:03
啊,什么意思啊,这个其实也不难,但是你看比如说呢,我们针对于某一个表呢,这个增删改查的时候啊,这时候会去加锁吗?啊其实不会去呃,就即使我们用的是这个应用DB是吧,他也不会呢去呃把我们这个表呢,相当于给锁住的啊不管你是呃这个共享的也好,独占也好,都不会去加是吧?啊但是的话呢,如果我们要是对这个表呢,进行这个DDL的操作啊,比如说你想修改这个表的结构,或者说呢,删除这个表是吧?像这样的行为的话呢,对整个这个表呢,是不是产生影响了,那此时的话呢,我们就会。啊,这个有相关的这个锁的出现了啊,你比如说呢,你要是现在呢,呃,正在进行这个操作,正在进行这个操作呢,这是其中的一个事物,那么另外的事物呢,如果想进行增产改查,那你是不是一定要等一等。对吧,一定要等一等,因为它会对这个表结构呢产生影响是吧,这是一个啊,再换一个角度来讲的话,如果呢,你现在正在进行这个增删改查,那如果说呢,我们要是执行这个DD2操的话呢,是不是你也得等一等。对吧,你也得等等,你想如果他要执行成了你在同一个事故当中刚查,那这个第一次查完的跟后边查完的这个结构都不一样了,这个就出问题了是吧?诶这个呢,就是我们说的这样一个场景,那么我们这里边呢,所谓这种等一等啊,其实就是我们说的这个阻塞的行为啊,会给我们这个,哎在S沃层啊,针对我们这种DDL的这种操作呢,我们有一个叫数据锁啊这样的一个概念,叫这个lock。
05:24
啊,这个lockx这个呢,咱们一会儿呢,去说这个原数据锁的时候再提啊,诶为什么这块呢,想说一下它呢,就是咱们虽然提到说这个因DB呢,我们很少呢在表级变呢去加锁,因为呢,我们想体现这个叫并发的高的这样场景,但是呢,我们在印度DB中也会有这种表基锁的存在。啊,就是我们提到这个叫dim dl是吧。好,那么嗯拉回来啊,知道有这样场景就可以了,然后呢,我们运动低密呢,很少去使用这个表级别,就我们现在提到这个X锁或者X锁啊呃,在一些特殊场景下呢,比如说叫崩溃恢复了,我们才可能会用到啊,下边呢,就是这样的一个使用方式啊,诶我们去手动的去加,那么咱们一般呢,你要是用这个表级别的S锁或者X锁的话呢,通常都是叫MYS了。
06:08
啊,通常都是买S,那怎么手动的去加呢?诶就是这样一个写法啊,Lock tables啊这呢就我们一个表明加上一个叫read啊,这就是共享锁right,这就我们的叫排打锁啊就这样个场景。OK吧,啊,这样个场景,好呃,那么咱们这块呢,说尽量不要在印度DB中去使用它,这个咱们刚才已经说过了啊,哎,它的厉害之处呢,就是有这个更细力度的这个行锁,那我们下边呢,就以这个MY咱们去举例。啊,虽然我以这个MY去举例,但是呢,大家你把这个NG呢,改成这个印度DB啊,同样的是OK的啊,只不过呢,不是说呢就没有必要呢在它里边用表了,那我们就拿这个MY来举例吧,好,这里边我们CTRLC1下回过来啊,比如我们回到第一个啊这样的一个,诶绘画当中咱们把这个呢给它粘过来,相当于呢,我们是不是创建了一个表是吧。哎,创建个表以后呢,我们把这个数据呢,给它加进去一条,这都比较简单,咱就直接粘了。
07:01
加进一条数据A啊,加上以后的话呢,我们可以呢,去select啊做一个查看啊,行from一下这个呢,我们叫mylo是吧。好,这呢,我们是不是就有这样的一条数据A了,然后呢,你可以再换一个我们这个绘画啊,我们也可以再去做一个查询啊,Selecting from,哎,My lock,哎,都能查到,行,这是没有问题的。啊,没有问题的,呃,然后下边的话呢,我们可以呢,去做这样的一个查看啊,比如查看这个表上呢加过的锁,然后呢,我们可以呢,去主动的去加锁啊,加这个读锁或者这个写锁,然后呢,我们再查看一下是不是加了,最后呢再释放啊先把这个基本的操作呢,我们给大家去演示一下啊,诶比如说我们回到这个150这块,咱们针对这个mylo这个表,咱们呢去加锁啊,加刚才说的这个表级别的啊,这个X或者X锁啊,首先呢,我们先查看一下呢,是不是有锁啊,这个怎么查看呢?我们那个叫呃,Show一下open啊tables。来通过这样的一个指令来走起,在这个指令当中呢,你看就是呈现出来的,就是我们这里边呢,包含的这样的一些表,看很多哈,呃,然后在这里边呢,我们主要关注的这个字段呢,是谁呀?是这个叫in use啊in use呢就是你正在使用,那其实就相当于是它会有这个锁的这个情况,目前呢,你看我们这里边呢,是不是没有任何的这个锁是吧?哎,所以你要是觉得太长的话,咱们可以这么着啊。
08:21
嗯,或者说呢,我们这里边儿呢,就想查看一下啊,Where叫in。啊,Use啊,是不是我想查看一下这个大于零的呀,啊,那这个要是零的话呢,就意味着都是零的话,就意味着我们这种没有啊锁定的这个表好下边呢,我们针对咱们这个table呢,去加上一个呃表级别的这个S锁吧,啊怎么办呢?那我们叫lock tables。啊,这个叫mylo这个表,然后加上一个read是吧?哎,这样我们透气好,加完以后的话呢,我们再去呢,看这个in use大于零,好这时候大家会发现呢,是不?我们这个表呢,就in use就是依赖啊,相当于我们加了一个这个S是吧,我们叫S数啊好,那这时候我们怎么去释放呢?那就叫unlock啊unlock呢叫tables啊这样就行。
09:05
哎,就释放了,释放以后呢,你再去查看大于零的,那这就没有了。没有了是吧,哎,我们也跟它叫I lock tables,嗯,My lockck啊加上一个right,这就相当于加了一个是不是叫X锁是吧?啊表级别的啊,然后我们走起,然后你再查看这个大于零的它是不是也有啊好,然后我们再去呢,叫unlock,这个叫tables,哎这样呢就释放了啊再查看下这个大于零的它就没有了,好先把我们这个基本的操作呢,咱们给大家去演示一下,好,那演示完以后的话呢,咱们下边呢,来看一看具体的这个,诶操作的这个实际的这个行为。这个呢,就是我们下边写的这叫步骤五叫加读锁啊,表级别的这个X锁,然后再一个呢,就是加表级别的这个写锁啊,就是这个X锁啊,那它的一个实际情况,那最终呢,我们会汇总出来了一个啊总结啊,就是这样一个总结,那咱们把这个总结呢,我就先盯一下了,咱们就来验证一下这里边这个事实。
10:00
好,来,我就放这儿了啊,咱们就以这两个为例吧。呃,我们想验证一下呢,针对我们这个表级别呢,咱们先看这个叫毒素啊,哎,我这么着弄啊,首先呢,我们啊这个其实你begin不begin呢,都还好啊,因为我们针对这个表整个是加了一个锁了是吧。加上吧,IK啊,嗯,这时候呢,我们去干什么呢?嗯,咱们去lock。Lock这个。Tables啊,Mylo来加上一个读锁,那就写个read呗,啊凑齐,那现在相当于我们是把这个表呢整个给锁住了,对吧,锁住以后呢,这里边提到了说自己可读吗?哎,就是我们自己能不能去读这张表,就这个意思,来我们看一下。啊,Select from一下叫mylo,哎,自己可以读,那这个就是是是吧,自己可以写吗?哎,就是你针对我们这张表呢,能够进行这个增删改操作吗?那就这个意思,你比如说我们像update一下啊mylo。然后呢,Set一下这个name呢,等于比如说叫A1啊,然后where呢,ID等于一,是不是想修改啊来走起哎,你会发现呢,是不是就不让我们这时候呢去写吧。
11:07
啊,不让我们去写,我真的是以update为例啊,你也可以inser的啊,诶是否的啊,自己能操作其他的表吗?哎,其他表我们这个里边呢,比如说嗯,我记得咱们还有什么表啊,刚才这是不是用了一个account是吧?来我们看一下啊,哎,我selecting from叫做account,来走起。哎,你会发现呢,现在是不是也不让我们去访问其他的这个表啊。啊,因为我们没有锁定啊,哎,不让我们去访问,所以这个呢,也是否那么他人可读可写吗?他人就是另外的这个绘画为代表的其他的这个事物啊,其他的事物好,他人可读吗?那你比如我们在这里边呢,我们去啊,你加不加这个比例呢,都无所谓了啊,我去select啊行诶from一下,我们这个叫mylo是吧。可读吗?还可以读?可以读他人可写吗?否啊,不能写啊,你比如说我们这时候呢,Update一下,嗯,咱们这个mylo,哎,Set一下这个name等于啊刚才说的,比如我叫A2了啊说VRID等于一好走起。
12:07
啊,这时候大家你看是不是我们就在这等待了,相当于就是阻塞了啊,那就是说可写嘛否啊,你得等。看得等才行啊,什么时候能写了呢,你是不是一定得等到我们这个时候呢,把这个表呢,给它释放了才行啊,啊因为呢,目前呢,我们说呢。咱们去一下,叫open tables。嗯,然后呢,叫where。啊,Where什么呀啊。啊E,然后大于零,现在呢,我们是不是把这个表呢,整个给锁住了啊,这样的情况啊,行,那接下来怎么办呢?我们就得是去unlock一下啊,这个叫tables,我们就能把这个表呢,是不是给释放了啊,这个表释放以后啊,那么回过来。哎,我们这个update这个操作呢,你发现呢,他才执行成功了。对吧,哎,是这样个情况,然后你再去做这个select的操作呢,是不是就改成这个叫A2了。啊,没有问题啊啊没有问题啊好呃,这个呢,就是我们给大家演示的是不是叫这个读索啊呃,大家呢,呃形象点去理解一下啊,就是我们针对这个表呢,给他呢加了个读索,这时候呢,你自己其实还挺特别的啊,自己呢能读,自己呢都不能写,然后呢,这个你也不能去操作别的表啊,别的表的话呢,诶读跟读这块呢是诶都可以的是吧?呃,但是呢,因为我们说呢,读跟读的这个行为呢,它不会对我们这个数据呢产生并发问题啊,所以这没问题,但是你写不行啊,因为已经加锁了是吧。
13:26
好,这就过了啊,然后接下来咱们给大家演示一下,这个叫写索啊,写锁的话呢,那就这么着,嗯,咱们呢,呃,针对我们这个my lock啊,怎么写还记得吧,哎,Lock。Tables,然后呢叫mylock这个表啊叫right,诶这个呢,我现在给大加了一个写索是吧?嗯,我们接着呢去引用查看一下啊,这时候呢,其实已经加这个啊X锁了啊排大锁了,那么加完以后啊,自己呢可读吗?哎,我们自己呢查一下啊。哎,自己可读吗?哎,自己可读自己可写吗?啊,这我也写的是,那我们来一个update吧。
14:04
Mylo。啊,Set一下name呢,等于比如叫A3啊,啊where。I等于一。哎,没问题是吧,哎,这个我们也可以呢,去做一个呃写的操作,嗯,自己呢可操作其他表吗?否,那我们再去操作一下。哎,Select星哎,From,哎,Account是吧?哎,走起这时候是不是也不让啊,哎,不让啊,这个呢就满足,然后他人可读他人可写嘛,啊这个都得等,你想你这已经是一个排大所了,别人还想读,那这不就有并发问题嘛,所以都得等啊,所以回到这块呢,哎,我们呢想去洗like的清from my lock,走起,那这种呢,是不是就得等?啊就得等啊,这个呢是不行的,那我CTRLC一下啊把它断掉,然后呢,哎,它是可写吗?哎,可写也得等啊,比如我们这种呢,再去做一个update,把那个改成呢叫A啊改成A5吧,哎,头起是不是也得等,哎,这就我们说的这样个场景。
15:01
啊,这样一个场景行。那么人家这个呃,事物能读别的表吗?那毫无疑问呢,跟你这有没关系,愿意读就读呗,是吧,关键你就看别的表有没有这个读和写的这个锁了哈,好,我们这块呢,也把它停一下行,那么刚才这个演示的话呢,大家是不是就清楚了啊,就是我们给大家演示一下,我们针对这个表,哎,咱们加这个,呃,这个叫什么。呃,共享锁还是加加这个呢,叫排查锁啊,这样的一个情况啊,是什么样子的啊,最后呢,咱们把这个呢,也给它关这个解锁一下啊啊lock哎,Tables是吧,这个我们再引用S查看一下。啊,没了吧,行啊回过来啊,这块呢,我们做一个这个总结啊,总结总结大家呢,你也可以看我这个课件里边呢,写的这个表格里边呢,就有我刚才做的这样的一个操作,嗯,OK。哎,说这个MYS呢,这个存储引擎在我们查询的时候呢,诶会加呢,就是这个读索表级别的加读索,在进行增删改操作的时候呢,我们会给这个表别的加的叫写锁了。
16:00
啊,而我们这个in DB的话呢,咱们通常就不会呃,在表级别呢去做这样个设置的啊,因为咱们诶都有更力度低的那个行锁去处理的是吧?诶这个大家注意一下啊,但是我上面这个演示的话呢,当然你可以考虑呢,改成印度DB啊去测试是没问题的啊,只不过实际开发中我们很少这样去做而已。好,那么这个my circle当中表级锁的模式啊,咱们是以MYS这个表呢进行的演示,有表级的共享锁,表级的这个独占所啊,一个是S,一个是X啊,它的这个情况呢,我们刚才就演示清楚了。啊,大家来理解一下啊。同学们,咱们接着来看第二种这个表级别的这个锁叫做意向锁啊啊意向锁啊,这个呢,注意是表级别的啊,咱们刚才呢,提到上边这个叫表级别的这个X锁和X锁的时候呢,咱们说呢,不建议大家在DB当中啊,在表级别呢,我们去加这个叫共享锁或者叫排他锁啊,因为这个性能比较低一些是吧?呃,你要买S呢,因为它不支持这个航机锁了,所以我们在MYS里边呢,你可以这样呢,去做处理啊,去做这样处理,呃,但是呢,我们说这个印DB当中啊,它还是有这个表锁的。
17:06
啊,这大家要注意它是有表锁的,那其中一个表锁呢,咱们刚才在讲这个第一个的时候呢,其实就提到过了,是不是就提到这个MDL这个锁呀。嗯,在哪在这儿呢是吧,哎,就提到这个MDL这个锁,因为呢,针对这个DDL的这种行为呢,我们需要呢,必要的加上一些这个锁啊,MDL这个呢,就属于我们还要这个表级锁了是吧,那另外一个的话呢,就针对于咱们这个1DB啊。注意听,就为针对这个印DB啊,咱们还有这种表离锁啊,就叫做这个意向锁啊,叫做意向锁,那这时候大家会想说我们印度DB呢,说支持行锁,你就整个意向锁,这也是表离锁啊,刚才你要说这MDL的话呢,能理解,因为这整个表结构产生影响了,所以我们是力度大一点是吧,那你这个意向锁到底干什么呢?会不会导致我们这个呃,并发性就低了呢?哎,其实不会的啊,其实不会的啊,这时候你听我讲啊,哎,意向锁到底是干什么用的?你看这里边提到了,说这个印度DB啊,它允许啊,它出现了我们这个意向所啊,它允许我们这个航机所跟这个表基所呢是共存的,诶首先呢,通过这样一句话呢,是不是你就能够体会到,哎,它并不会使我们这个性能变低。
18:14
对吧,哎,不会说呢,因为我们加了一个这个印度DV表中的一个意向锁,导致呢,我们就没有办法去加这个行机锁了啊,这个是可以共存的,或者换句话说呢,诶就是能共生啊,因为我们这个表级别的这个意向所的存在呢,能够使得我们接下来的一些判断所的行为呢,这个性能反而会更高。啊,会更高啊,现在已经把大家这个心思呢抬得很高了,是吧,现在你就需要知道呢,我们这个意向所到底是干什么用的啊,这里边提到了,说他的出现呢,就是为了协调航索和表索的关系啊,刚才其实我提到就是这个点是吧,说这意向所呢,它是一种不与这个航机所呢冲突的这种表记所啊,他要冲突了,那麻烦了,那相当于我们这时候呢,In这个DB呢,相当于也退化成是一个表级别的了,那就比较恶心了,化性就很低了,是吧?啊还是这句话啊,那么大家目前呢,你去看的话呢,多少还是看不太懂的啊,包括呢,我们怎么去添加啊,这个呢,先一会儿说,呃,你看不太懂,那所以呢,我们先来看这儿。
19:10
说这个意向锁呢,我们要解决的问题是什么啊,把这个说清楚以后呢,大家就知道啊,为什么说意向锁的出现呢,反而使得我们这种航机锁的添加呢,性能反而会更高一些啊,但是你看我这里边儿这个需求,我这呢有两个事物是吧,T1和T2。啊,现在咱们这个T2啊,他想在这个表级别啊,加上一个呃共享锁,或者加上一个排查锁啊T2呢,想在整个这个表级别呢,去做一个添加,那么这个能不能添加呢?啊,你得看我们这个表上呢,是不是说呢,在之前有过,呃其他的一些事物呢,对这个表表级别也好,或者说某一个行级别也好呢,加过这个锁能理解吧?啊举个例子啊,你比如说呢,我们T这个事物,针对于其中的某一行数据,我加上了一个叫X所。我要加上一个X锁之X锁之后呢,我们T2的这样的一个事物,你想在整个这个表,注意我这个呢,是只是针对这条记录甲的哈,你要针对我们这个表,T2呢,想加一个表级别的一个啊X锁呢肯定就加不了了。
20:14
啊,就会阻塞,为啥呢?因为我们这的针对这条记录是不是已经加了加锁了,对吧?啊,那这时候呢,我们就不能加,那你说不能加是咱们看到了,说你这加锁了,那对于我们这个呃,机器来讲的话呢,它是不是需要呢,判断一下到底加没加好,那如果我们这个表呢,有10万条数据啊,那我们针对其中一条数据再加了一个X锁,大家你想一想,我们T2呢,要去判断这个能不能加这个X锁的时候呢,你要是一条一条这样去变这个表中的这个数据判看呢,说有没有这个X锁的出现,这个性能呢,是不是显然特别差。是吧,是显然特别差啊,那怎么办就能快一点呢?诶当我们针对于这一行数据,咱们加了一个X锁之后,那么会自动的,诶在我们这一个啊行记录的,咱们这是行记锁了啊,它的上一层,上一层你可以理解成是一个业绩锁,或者理解成是一个表记锁,哎在它的上一层这个概念当中,我们就会加一个啊,比如咱们就以这个表基倍为例啊加一个什么呢?诶叫做啊意向的,因为你这是一个X的一个行锁,是吧?我就会加一个意向的这个X这样一个锁。
21:18
诶,我就自动的去加了啊,那就相当于我们针对这条记录呢,你加了一个X锁之后呢,其实相当于是有两个锁的出现,一个呢是这个本身,一个呢是自动的给我们加了一个这样的锁,好那么接下来你这个T2呢,你想去加上一个全表的一个排他锁的时候呢,我们就不需要一条一条集中的去找有没有这个X锁了,时间呢,就发现这个表级别呢,是不是已经有这样的,呃,意向的这个排打所存在了,是吧?那既然存在的话呢,那这时候呢,你的这个添加呢,直接呢就阻塞了。所以就用不着我们一条一条这样的去比较,哎,这个呢,就能够看到它的这个性能是不是更更好一些。对吧,诶,他要解决的就是这样问题啊,那么总结一下的话呢,就是如果我们给某一行的数据加上了排查锁,数据库呢,会自动的给更大一级别的空间,比如说数据页或者数据表上呢,去加上这个叫意向锁,那么告诉呢,其他人这个数据页或者表中已经有人上过排查锁了。
22:10
啊,那你如果呢,其他人呢,想要去针对这个表呢,上这个排查所的时候呢,你就需要呢,做一个注册好,那么具体这时候呢,我们分成呢,叫意向的共享锁和意向的排查锁这样的两种表及锁啊那么如果呢,我们呃想要获取数据表中某些记录的这个共享锁。想要获取某些这个记录的这个共享锁,我们就会在这个数据表上去添加的叫意向共享锁,诶如果你想获取这个里边呢这个,诶某些记录的这个叫排查锁,我们就会呢添加叫意向排他锁。啊,就是这个是共享的啊,对应这就是共享的,这是排他的,这个就是排他的,注意这个时候我们指的是自动的来进行添加的,不需要我们手动去维护,就是你自己呢,想加针对某一行数据或者某几行数据,想加什么锁你就加,加完之后呢,自动的在表级别呢,就会给我们去添加意向的相应的那个锁啊就是这样的一个意思。
23:02
啊就这两个意思,好,那么理解这个以后的话呢,诶大家你再看我们这里边这些话呢,你会更清晰一些啊那么如何呢,去添加这个意向共享所呢,呃,就是针对你这个呃数据查询的这个语句呢,后边我们加个叫lock in share mode啊这呢就相当于是会获取一个叫is的一个锁啊其实呢,这里边呢,为代表的就是呃,你会首先呢,针对于我们这里边涉及到的这个数据呢,是不是加了一个S锁是吧。然后呢,针对你涉及到的这,比如说三行数据加了S索了,同时的话呢,诶自动的帮我们加了一个意向共享素啊,是这意思啊,那下边这块呢,你是有个叫for update update,我们说呢,是不是加这个叫X是吧?你这里边要几条记录啊,不是全表话呢,那就针对这几条记录呢,加的这个叫排,然后呢,诶DB会自动的帮我们去加上叫意向的啊排索是表级别的。啊,就是这样一个场景,好,那这个记入以后的话呢,我们下面就给大家举例子啊,这呢就提到另外一个表叫T表,然后呢,ID和name啊,我们呢,添加这样的几条记录啊,我们去做个演示,好,首先呢,这里边CTRLC选中啊汇过来。
24:06
啊,针对呢,咱们之前呢,测试的这些场景呢,大家一定要注意,我们前面这块呢,该相应的结束的一些事物呢,都给它都结束掉啊啊那这块呢,我们先把它呢粘过来。啊,粘过来以后呢,做一个执行啊,这就创建好这个表了,然后呢,往这个表中呢,我们添加呢,诶六条记录。啊,这个我们再粘过来。好记录呢,也填写好了,呃,填写好以后的话呢,首先我们做一个查看啊,先查看一下,那from一下这个叫teacher。好,这呢数据都有啊,这个呢,就相当于是独立的就成为一个事这个事物了,是吧,哎,我们在这呢也查看一下啊,来就行。Teacher啊,这也没问题,好,那么我们首先呢,来看一下当前的这个隔离级别是什么,那我们在这个叫。哎,这叫这个read,这个隔离级别下,我们去做这个演示。啊,Repeat read是吧?啊这个呢,也不用看了啊,这个咱们也没设置过,肯定都是这个默认的好,那么接下来的话呢,我们去做这样的一个操作啊,首先呢,在我们当前这个150第一个这个啊绘画当中,我们去开启一个事物,诶注意这时候的话呢,跟咱们前面讲的那个表里所不一样了,咱们前面呢,没有比例了啊啊锁定我们整个的表这块儿呢,呃,你是针对某一行数据,咱们去加上像哎某或者某几行啊加上这个X组或X组,所以我们这时候呢,再交在这个事物中去体现啊,加上这个比begin啊。
25:26
那么接下来的话呢,我们可以这样啊,我去select星from一下,这个叫teacher。啊,然后呢,Where ID呢,等于比如就查看这个六好,然后后边呢,注意我加上一个叫for update啊,那就相当于呢,这呢,如果说就只有一条记录的话呢,是不是针对这条记录我加了一个X锁呀。啊,写成大写的啊,或者写成小写了啊X锁好这呢是我们自己主动加的,然后的话呢,会自动的在这个表级别上,是不是给我们加上个意向的这个X锁了,哎,所以其实呢,这条语句下去呢,会有两个所出现啊。行,那这块我们回撤一下啊,是不是就执行完了是吧,当年这个事物的话,注意还没有结束,然后的话呢,回过来,哎,我们在另外的一个这样的一个表中呢,我们,呃,体现的比如说是一个具体的事物了。
26:12
不是表中了啊,另外的一个这个绘画当中啊,我们开启一个事物,然后接下来怎么办呢?我想整个把teacher这一张表上边加上一个表级别哈,咱们加上一个X锁。啊,我想这样的去处理啊,这个怎么加来着,咱们那会呢,是不是演示过啊叫lock tables啊teacher啊teacher这个表,然后呢,我们嗯,加上一个X或者是S都行。啊都行为啥呢,因为咱们刚才这个呢,加的是不是一个X锁了啊,这条X的话呢,你这块呢,加X也好,加X也好,是不是正常来讲呢,都会有这种,哎,这个阻塞的这个场景出现是吧?好那么这时候呢,注意我们要是这样呢,去操作的话呢,你觉得我们会阻塞吗。啊,会不会阻塞呀,哎,这时候你发现它是不是就阻塞了。哎,就阻塞了是吧,那么这个时候呢,它阻塞的,呃就是原因是什么,以及说呢,我们呃为什么说这套操作呢,它会阻塞啊,呃相当于是这样的场景,我现在呢,想针对于咱们这个T恤这个表呢,是不是加上一个S锁是吧?那么这时候呢,我们需要保证的点就是如果你要是能够执行啊,没有阻塞的话呢,是不是诶针对于我们整个这个表。
27:19
啊,你在这个事物执行之前,那么其他的这个事物啊,是不是不要针对这个表见过啊见S见这个S行不行啊是可以的,因为这S跟S呢是可以,呃这个兼容的是吧?呃这个这个不算啊哎,你要是整个在这个表级别的话呢,你不要去加上这个,这个没事啊,诶不要加这个X锁。啊,你要加的话呢,这个就阻塞了是吧,这是一个另外的话呢,就是你这里边儿这个记录当中哈,不要加过这个X锁。那你要加固的话呢,它这块也得阻塞,是不是就主要这两种场景啊,对吧?那么第一种场景的话呢,好判断,因为表级变的一看有没有就知道了,那么第二个呢,就我们刚才说的,你要是这个记录特别多的时候呢,一个个去判断这是不是能累死啊,性能极低啊,怎么办呢?诶你会发现呢,当我们针对这一行数据呢,加上一个X锁之后呢,自动的在这个表级别就给我们加了一个is。
28:10
一加这个is,那么这时候我们需要呢,知道的就是这个is跟我们这个S呢,它俩呢矛盾不矛盾啊,我们说呢,这俩呢是不兼容的。啊,因为我这是表级别的SX是吧,你这是,哎这呢就是阻塞了。哎,大家就会看到这样的一个场景。是吧,还有这个场景,那么对应的过来呢,做一个总结的话呢,就是这块啊,咱们刚才呢,相当于是不是加了一个这样的一个。Ix是吧,然后呢,你是不是又想加上一个这个呀。啊,那这时候呢,我们说呢,他是不是互斥的呀,哎就不行是吧,哎,那同样的话呢,就是还有其他的这种互斥的这种场景,诶我就不一个一个的跟大家去举例子了,是吧?哎,这是互斥的场景,然后这种的话,你发现它是兼容的啊,因为呢,我们这是毒,这个你也是独独跟独之间呢,是没有任何问题的啊,只有它是兼容的。啊,这个也很好去理解啊,我刚才呢,给大家演示的是不是我们这种场景是吧。
29:00
啊,这种场景啊。好OK吧,OK啊行,那这时候的话呢,你发现它这时候呢,呃,就就这么着卡到这儿了啊,那除非呢是这块呢,我们把这个相应的这个锁呢给释放掉。啊,是不是才可以啊所释放掉啊,你比如说我们这种呢,做一个这个commit操作来,我们走起一下。啊,然后呢,再回过来,诶当然你看这时候呢,是不是就已经给他诶lock住了对吧?诶因为呢,我们这块一提交的话呢,相当于我们这个事呢结束了,那针对你这一行数据的啊,这个呢叫X呢,就相当于呢就释放了啊那么相应的话呢,你这个ix呢,它也就释放了,诶所以这时候呢,我们就可以呢进行一个锁定。啊,你看这会就锁定了是吧,来锁定,那这会咱们把它也解了吧,解的话呢,还记得吧啊unlock啊tables是吧,就解了啊。好,那这块呢,我们就呃说清楚这个事儿了,然后的话呢,这里边还要提一个什么点呢,就是这个叫意向共享锁或者意向排查锁,跟其他的这个意向来共享锁和排查锁之间的这种兼容性,大家你会发现呢,诶这个表级别的锁他们怎么,诶这这这怎么是兼容的呢。
30:07
嗯,大家能理解吗?你看这三个是吧,主要的是不是这三个。这个为什么是兼容的呀。啊,你注意啊,咱们这个呢,虽然是表级别的,但是它其实刻画的是不是具体的是某一行或者某几行的这个情况,对吧?诶大家你看我们这里边啊,我给你举例子你就知道了,咱们在这块的话呢,比如我还是重复咱们刚才这样一个情况,我举一个比例,然后的话呢,咱们,诶这么着操作一下,相当于针对于这一条记录呢,我们是不是有一个X,也有一个表级别的ix了,没问题是吧?好,那么接下来嗯,这个你用它也行,或者我们再再换一个这个吧。啊,接下来啊,我这儿呢,也来一个begin。笔上没问题是吧,嗯,然后呢,我去,嗯,我这样粘一下吧。哎,我这么着。啊,复制一下。哎,拿过来啊,注意看啊,我粘过来,呃,这时候的话呢,我要针对这个ID是六的这个,我要是用这个for update,你觉得这个事靠谱吗。
31:02
走起是不是不靠谱,哎阻塞为什么呀?哎,这个阻塞呢,不是因为咱们这个isx跟isx呢去阻塞了,它俩呢,其实是无辜的啊,你说你这个is这个不是它俩是吧?是因为呢,我们前面这呢,是不是还有个行级别的X跟你这个行级别的X它俩呢不兼容啊啊造成的,注意啊是这个原因造成的啊这是我们CTRLC一下,咱把它停掉,你看我这样操作,我这呢把这个六呢我改成是五。哎,来,我再去走,大家你会发现呢,诶怎么这个时候呢,就没事儿呢。啊,这时候为什么没事呢?哎,你看啊,这个时候呢,你针对于五的这条数据呢,加了一个X速。X所是吧,然后呢,表级别呢,是不是有个X,然后我们刚才这块呢,针对于六这条数据呢,是不是有个X所,然后表级别呢有个ix是吧?首先呢,这两个S之间是不是没冲突,你这是ID是六,我这ID是五,他俩没冲突啊是吧?然后呢,你这是表极为,我这也表极为的,咱哥俩呢也没有冲突。啊,这块呢,咱们举的例子就相当于来表达的是这块。
32:02
啊,就这块儿啊,应该大家清楚啊呃,这个你要说这块要是不兼容,那还麻烦了。是吧,你知道为什么麻烦了吗?啊,如果说要不兼容的话呢,意味着我们现在这块呢,是不是就查不出来,就意味着现在在阻塞它要阻塞话呢,相当于是啊行级的一个锁,然后呢,你非得硬生生的给它拉成一个表级别的锁了,我们一诺DB的这个优良特性啊,一下子就给干没了。是吧,那就成这样的意思了,好体会一下我刚才说的这样的一个意思。好,那么总结一下下来讲的话呢,就其实我们这个呃意向所是吧,它的出现啊,不管你是这个也好,还是这个也好啊呃,它的出现呢,其实就是为了协调我们行锁和表索的啊,然后呢,这个因为行锁跟表所之间,我们说存在这个S呀X啊,它们之间有一些这个呃阻塞的一个情况是吧,然后为了避免我们这个表索呢,需要呃一行一行的去判断这个行锁,所以我们在表级别呢,给你对应的去生成行所对应的这个意向锁,然后让你很方便的去来判断呢,能不能去有这个同时访问的这个场景,诶就是这样的一个作用啊,这样个作用。
33:07
好,那么关于这个表呢,哎,大家呢,去体会一下啊行,那么下边这个关于这个意向锁的并发性,其实刚才我也演示了啊,就是咱们一个是五,一个是六的这样一个场景。好,得出来这个结论,说印度DB呢支持多力度锁,在特定场景下的行基锁和表基锁呢,是可以共存的。是这意思吧,哎这个呢表级锁呢,我们提到了叫意向的这个,哎这个表级的这个锁说意向锁呢之间呢,是不排斥的,除了这个is和这个呢,兼容之外呢,意向锁跟共享这个是表级别的啊,哎,他们是互斥的,这不刚才说了吗。是不是这个。啊,OK,行,嗯,然后下边说呢,这个嗯,Ix跟他啊是表级的这个所不会抗级的这个发生冲突啊,这刚才上面都有啊,只会跟表级的这个发生冲突,说呢,这个意向所呢,在保证并发性的前提下,实现了行级所和表级所共存,且满足事物隔离性的要求,行,那么关于这个意向所呢,我们就说完了。啊,大家呢,应该比较清楚它的主要作用是什么。
我来说两句