00:00
好,那么下面的话呢,咱们就正式的来讲这个锁啊,这个锁的话呢,这个其实大家如果之前呢,没有接触过这个锁的内容的话呢,那这时候你会觉得这个东西还是比较多的啊,这也是咱们这章里边呢,稍微有难度的这个点啊,锁呢比较多,那如果让大家之前呢接触过这个锁的概念啊,对这个锁呢有个直观的一个理解,那么这时候呢,学起来呢,会更加的轻松一些啊,这章的话呢,也是啊,这个每一章的话呢,都是说比较难啃一些啊,那这张话呢,重点呢,就在于我们如何呢把这些锁呢给大家理的比较清楚啊,这里呢,我通过几个不同的维度呢,咱们对这个锁呢来进行一个讲解啊,有这样几个维度,首先的话呢,我们从对数据这个操作的类型上来划分,咱们分成了叫,呃,严格上来讲呢,应该叫共享锁和排他锁啊,一个叫X锁,一个呢叫X锁啊,只不过呢,我们习惯上呢,把这个共享锁呢,说跟那个毒锁,因为毒的行为呢,我们说是可以独独共享的是吧。啊,当然呢,一会儿这个细节的区别,咱们一会儿再说啊,啊就是共享的和排他的啊这样的一个区别。好,那么针对这个索的力度上呢进行划分,咱们呢分成呢叫表极索啊,表极索呢,就是属于这个力度呢,就比较粗一些啊,表极索的下面呢,我们有这个叫叶极锁啊,叶级锁下面有这个叫行级锁啊,咱们重点呢需要掌握的就是表极锁跟这个行级锁,所以这呢我就把它俩呢放在前边了,那么在这个表级锁这个层面啊,你如说像我们这个MYS,它只支持这个表极锁对吧?啊,那这呢,我们就主要看这几个,那么像这个印度DB的话呢,它既可以支持表极锁,也可以支持这个行级锁。
01:25
啊,当然呢,阴DB的话呢,我们用航机锁的话呢,让它这个力度更小,它这个并发性呢就会更好一些,所以呢,阴DB呢,一般呢,咱们都用这个叫航机锁啊,具体的话呢,有这么多种锁啊,这么多种所啊,这个我就不一个一个去念了啊,咱们下边这块呢,都会给大家呢去讲到,好,那么对待这个所的态度呢,来进行这个划分,分成了叫悲观所和这个乐观所啊,一个呢叫悲观,一个叫乐观,对吧?啊就跟着说有个瓶一样啊,就只有半瓶水了,悲观的人说呢,说哎呀就剩半瓶水了,乐观的人会说呢,说哎,还剩半瓶水对吧?啊,那我们对待所的态度也是一样啊,那我们说呢,呃,你会担心他到底会不会修改我们的数据啊,这种悲观的呀,乐观的呀,这样的态度啊,我们下边下边也会提到这样的这个情况啊,那么再者呢,就提到这个枷锁的方式啊,我们可以呢去显示的枷锁,也可以呢,去隐示的枷锁啊,那么其他的话呢,涉及到这个全局锁和的这个词锁的问题啊,这呢就是整个咱们要讲解的这样的一个顺序啊,顺序呢也是按照这个顺序来讲解的。
02:22
好,那么首先的话呢,我们来给大家呢去讲解,这里边那叫读索写锁,或者我们叫共享锁和排查锁,OK好,我们这块呢,就来看啊,从这个数据操作的类型啊,我们分成叫读和写啊,读跟写的话呢,我们泛泛的去划分呢,读呢就是共享了是吧,写呢叫做排他了,OK好,我们这块来看一下这个针对于这个读读的这种场景的话呢,我们说呢,不会引起什么问题啊,后边这块呢,写写读写和写读就会出现我们提到的这些问题是吧,那针对这些问题的话呢,我们,呃,尤其呢是咱们提到的后边这两个。啊,这个这个咱们说呢,有两种方案,一个呢是ACC,一个呢是加锁是吧,那ACC呢,咱们说了下一章再讲,所以说呢,我们这块呢就是加锁,那么写写的话呢,本身也是加锁是吧?所以呢,我们这里边呢,谈这几种情况呢,就全是加锁,那既然全都加锁了,里边呢涉及到有毒,涉及到有写,那是不是这块呢,我们就得是针对毒提供一种所,针对于血是不是提供一种锁,哎让这两者所呢,是不是相互阻塞啊就可以了。
03:21
好,那么这里边呢,我们就诶分成了两种锁啊,一种锁呢,叫做share的lockck啊简称呢就是s lockck就是S锁啊也会这样去叫,然后另外一个呢,叫做排卡锁啊exclusive lock这个呢有一个X,这呢,因为X跟X呢就是比较类似啊,所以我们这呢,就用这两个字母来表示的,S锁呢叫share啊就是共享锁,然后呢,X呢,诶我们称为的叫排他锁啊叫排他锁OK,那么也习惯上把这个共享锁呢,就对应的叫读锁,把这个排他锁呢,诶对应的叫写锁,因为写的话呢,你会发现呢,凡是呢,哎出现了写了,就像我们后边这三种情况,是不是它一定都是排他的啊,就是我们所谓的需要呢,相互阻塞,需要排队啊,你要是毒跟毒的话呢,他们就是共享的了啊,它不会出现任何的并发问题啊,就是这样个情况。
04:09
啊,所以这块呢,我会把这个毒锁呢跟共享锁呢放一起,写锁呢跟排大锁呢还放在一起啊,就是先泛泛的,这样我们呢有个对应关系啊。好,那么针对这个毒索的话呢,我们说同一份数据多个事物啊,如果都是进行这种毒的操作的话呢,我们说呢,是不是可以的,他们因为相互之间不会受任何影响,也不会阻塞啊,就是毒跟毒啊共享两个共享的锁啊,它们之间呢是哎互相的不会阻塞的啊,一会儿咱们给大家举例啊,然后这个写索的话呢,我们称为呢叫排他索了,用X来来表示说,当这个写操作呢,还没有完成前啊,你这个事物还没完成前,它会阻塞其他的这个邪索的这种事物和毒索的这个事物。啊排他嘛是吧,我现在正在啊这个操作呢,你其他的都得等这不是才构成这种阻塞啊,才构成这种排队的这种前提吗。
05:00
对吧,那这样的情况。好,那这里边呢,需要注意的呢,就是in DB这个引擎来讲呢,读索和写索呢,可以加在这个表上啊,也可以呢去加在这个行上啊,因为呢,In DB呢,它支持的力度比较小,到这个行级别了啊,行级别都能这个这个提现来的表级别呢,也可以去体现啊,没问题,那像这个MYS的话呢,它支持这个表级别这个锁啊,一会我们讲表锁的时候呢,再重点提啊,这哪有一个具体的举例啊举例啊,这个大家呢理解一下啊,说我们有一个事物提一它呢获取了某一行的这个二的这个行的一条数据的这个读索了,那么我们要另外一个时物呢,也是获得这个读索,可不可以它俩同时读啊,诶是可以的,哎,所以呢,他们S锁跟这个S锁呢,他们是兼容的,对吧,那么呃,如果说我们有一个T3这个事物呢,他想是去写的话呢,诶他必须得等待。啊,因为呢,这里边只要呢,有我们这个协所的参与的话,他就要排他锁,不管你是先是有的协所去操作这个数据,还是说呢,人家别人在读你是后有的这个协所,总之呢,诶他们都是这种不兼容的是吧,只要出现了我们这个X锁了,哎,都是不兼容的一个状态。
06:06
啊对吧,诶都是个不兼容的状态,好这个呢,大家先去理解,哎,然后呢,下边的话呢,我们把这个事讲清楚以后啊,咱们呢,可以通过代码的方式呢,给大家呢去做个演示啊啊这个去理解一下,然后下边的话呢,我们看一看如何呢去锁定这个读啊如何呢去锁这个读啊按说的话呢,我们锁定读不是用的叫S锁吗?啊这块我们提到说咱们其实提的呢,还不是特别的严谨。啊,咱们说呢,毒锁呢,就是S锁,其实这个毒的话呢,我们也可以给他去加上一个排他的行为。啊,也可以去加上排他行为,他可能同学有点懵了啊,咱们这里边呢,其实重点给大家讲的应该叫共享锁和排他锁啊,应该是突出这两个词。啊,只不过呢,我们说这个写锁呢,明确的它就是拍它的是吧,但是毒索这块呢,其实咱们也可以呢,让他是共享的,也可以让他呢去拍它啊应该是这个场景,OK,那怎么去理解呢。啊,大家看啊,就是针对于我们这个读的操作,读不就是select嘛,是吧,读这个操作呢,就是你select等等,在这呢,是一条语句,不管你是查一条数据啊,还是多条记录啊,我们后边呢,跟了一个后缀叫做lock in share mode。
07:11
啊,Lock in share,那这时候我们就是加的S锁啊,就是共享锁啊,在这个8.0的新特性里边,我们可以这样写啊,这一会再说这个事啊,那就是传统来讲我们都这样写啊,这样写这呢,我们加了S锁了,那么加S锁以后呢,如果我们这是一个叫事物T1了啊,那你要是其他这个事物呢,也针对于同样的这些数据,我们去加了这个S锁的话,它俩呃互相之间会阻塞嘛,我们说不会的是吧,那但是你要加写锁的话就会了,那写锁怎么去加呢?针对于我们同样的这个读的这个行为,咱们其实也可以加这个X组。啊,就是这个,呃,叫排他锁是吧,排他锁,那么这个排他锁呢,后边呢叫for update。For update就相当于你是一个增长改嘛。啊,Update是吧,当然你注意啊,我们这其实是个毒的行为哈,呃,那么这样的话呢,其实它加的就是一个X索,就是一个叫排他索啊,叫排他索啊,那么因为我们这个不管是5.7啊还是8.0啊,都这样去写,传统的都是这样去加,所以呢,8.0当中呢,诶跟它对应的,你看这俩长得不太一样哈,对应了一下呢,就把前面的又加了一个叫for share啊,这不就是S锁嘛。
08:16
那这个呢,就叫X。啊,这俩单词好像挺接近的啊,哎,就是这样个情况好,那么我们要是给它加了一个X所之后啊,比如说针对一个,呃15T1啊,我们呢,针对这个表中的一个数据呢,咱们加了一个叫X锁,就这样来加的,那么这时候呢,你不管我们这个T2的这个事物去操作它,你加的是X锁也好啊,这样的写法也好,还是呢,加了这个X锁也好,那实际上呢,我们都得是需要阻塞的啊,因为咱们刚才在这儿呢,是不是讲到这个事了。没有问题吧,好,那么说清楚这块呢,咱们给大家呢去做一个演示啊,做演示咱们就在命令行这块呢去说吧,啊首先的话呢,我们先去登录一下啊杠u root-P啊ABC123,好,那我们先去右示一下,比如说爱的硅谷DB3吧。
09:03
啊,让我们收一下这个叫tables啊好在这里边的话呢,我们有一个呢,这个account这样的一个账户啊,Account账户咱们先这样泛泛的我先查看一下。啊,Select from一下,这个叫account是吧?好,这里边呢,你看有这样三条记录,这个我们在没有去begin或者叫start transaction开启一个事物的时候呢,诶,那就默认的叫auto commit,相当于是一个自动提交的啊,你这块呢,相当于操作完以后事务也就结束了是吧?好,这呢是一个我们体现一个会话,代表的就是一个具体的算是事务吧,哎,然后这块我们再去启动一个啊。海I root。啊,登录成功了,我们也再去右侧一下叫艾特硅谷。呃,DB3好,然后我们去诶就可以了啊,诶这块呢,我们操作的都是咱们这叫account啊这样一个账户,好那么这呢就是体现了是两个不同的绘画,然后在这个绘画里边呢,我们去提供这个具体的事物啊哎,我这呢,通过这个begin呢,相当于就开启这个事物了,对吧?好,那么接下来的话呢,我通过呢叫select,诶from这个叫a account,哎,我后边呢,就写一个啊咱们写个什么样呢,叫做a lock in啊这个呢叫share mood是吧?OK,那这样方式呢,我是不是相当于就开启了一个叫S锁呀。
10:15
注意,这个S锁啊,叫共享锁。好,那我这开启了共享锁,那我这儿呢,是不是也可以开启一个共享锁,因为他俩呢是兼容的对吧?好,那所以这块呢,我也是去比拼一下啊select。哎,星那from,我们这个叫account,哎,Lock in。嗯,是M的好,注意看啊,我这会回车一下,当然你会发现呢,是不是我们这时候也能够查询出来啊。对吧,也能够查询出来,哎,这个我们再比如我再开一个吧。那么就意味着我们当前的这两个事物呢,你都是分别呢,针对我们这个表呢,咱们获取的都是S锁,S锁跟S锁之间呢,它们是相互怎么着啊,哎,兼容的对吧?哎,那么我们要是再去启动一个叫X锁呢,叫排打锁会怎么样呢?哎,你看啊M啊,Root重来啊。
11:06
放屁。哎,就可以了是吧,又是一下,哎,硅谷。DB3没问题,好,那这时候的话呢,你注意啊,我们先去呢,Begin开启一个事物啊,Select from,这个叫account啊,这时候呢,我写一个什么呢,叫做for啊。啊,叫update。注意看,我们开启了一个事物,这时候呢,我们相当于是要加一个X锁了,诶。诶,我这个这个X锁了是吧,那这时候你看我们前面这两个呢,是不是现在我这个事物都没有结束,是不是两个S锁都在,那么在X锁都在的情况下呢,你这时候能加他能加吗?不行是吧,所以呢,你看我会车大家你会发现他现在是不是就阻塞了。哎,这就我们所谓的这个叫阻塞的一个行为啊,阻塞的行为,那那他要想不阻塞,是不是得保证我们这两个呢,是不是都得结束才可以啊好,那这时候比如我们把这个呢结束了,那我用一个叫commit结束了,咱们当年这个15了,那这时候你看一下这块是不是仍然不会出来,是吧?哎,我们这时候呢,再把这个呢也结束了。
12:04
好,我这时候也结束了,好这时候你再看哎,他呢,是不是就查出来了,那相当于他就结束这个阻塞行为了啊,你就可以呢去获取了。这个很好理解是吧,好,那我们回过来呢,在这块就说一下,我们呢,先加上一个X所。啊,我再去begin,是不是又开启了一个事物,然后呢,我们这样的方式呢,哎,我这呢叫for update是吧。没问题吧,好走起啊,这个时候的话呢,我们嗯,哎哟,你看这块呢,哎,正好呢,这块也能演示哈,你看我现在呢,是不是启动一下,怎么没给出来呢,是不是阻塞了,为什么这种阻塞呢?是因为刚才我这个里边呢,是不是咱们还没有去结束咱们当前的这样的一个事物吧。哎,我这呢,这不相当于是一个X抬他的这个锁是吧。啊,X这个锁,那现在的话呢,你还没有结束,我们这时候又加了一个这个斜锁,那正好咱们把这个,呃,在X锁的情况下呢,再加个X锁的这个阻塞行为,这不有一演示了吗。没问题是吧,好,那这样呢,我们在这个时候呢,去加一个这个commit。
13:01
然后呢,这块呢,它是不是就查到了,哎,这块查的话,相当于我们目前呢,只有一个这个X啊这样的一个斜,咱要斜锁吧,或叫排他锁是吧,那在这个情况下呢,我们再去执行一个这个。嗯,加一个这个S锁看行不行。哎,我们呢,接着呢,是不是把这个执行起来,是不是这时候我要去执行仍然会阻塞吧,啊因为呢,咱们现在呢,是不是有一个X锁是吧?哎这样个情况啊,那这样的话呢,这不我就把这几种情况呢,都给大家去演示了吗。啊,这个都,哎这个呢就查出来了,但是这个数呢没结束啊行,咱们最后呢就结束一下。好,所有的事物呢,全都结束了,刚才的话呢,我演示了好几种情况啊,先有S的情况下呢,我们看跟S呢是不是兼容的没问题,然后呢,加了一个S呢,发现阻塞了是吧?然后呢,再有这个S的情况下呢,我们又演示这个X,然后再有S的情况下呢,我们又演示了这个S,哎这不这几种情况呢,我们就都哎说了说啊应该呢大家能有所理解啊好,那么在这个呃8.0当中啊,我们这呢提到这个新特性,那把这个新特性呢,我们可以提一下,你比如说呢,我们在已经有这个S所的这个情这个X啊这个有点绕哈,这俩词,那我们说中文吧。
14:09
在我们已经有这个叫排他锁的这个情况下啊,在已经有这个排他锁的情况下呢,我们要是再加入一个其他的一个,不管你是排他的还是共享的这个锁的时候呢,是不是它都得要等待啊,这时等待的话呢,这个什么时候会结束啊,哎,我们会有一个变量啊,去控制一下这个超时啊,一旦呢,你要超时的话呢,它就会结束了啊,这就起到一个超时的这个策略啊呃,那么如果说要是不用这个变量的话呢,在8.0当中啊,引入这个新特性,我们可以加一下这个后缀啊,就我们在现有的这个设置的后面的加后缀叫no wait,或者叫skip啊,Locked。啊,No way的话呢,就不等待啊,只要呢,我发现呢,我等不到锁的话呢,我就立刻返回了啊,就像你跟这个别人去约会啊,这个你到那儿以后呢,你看约会对象在没在在呢,那就挺好是吧?哎,没在没在立马走啊,这就叫no wait啊。好,那么这个呃叫skip lock的呢,哎,它也会立刻返回,但是呢,它诶只返回结果中不包含被锁定这个行的数据。
15:08
啊,你要是有数据呢,没有锁定,那他呢,就把这个数据呢给你返回。啊,这个大家注意一下啊,有这么一个小的这个区别,好,那这个咱们也稍微的给大家去做个演示啊,哎,刚才呢,这几个事物咱们都给结束了啊,这个就不用担心前面这个场景了啊哎,我们这块呢,去加上一个这样的begin啊,开启一个新的事物。呃,咱们就使用这个for update啊,这呢相当于我开启个事物,目前呢,是不是一个啊排查锁是吧,然后的话呢,咱们回到这块啊,我就用第三个,比如来演示啊,那此时的话呢,我们诶怎么着啊,我首先呢,也是begin一下没问题是吧,然后呢,我去select啊,行,诶from这个叫account,然后for,我就要for这个update吧,哎,For update好这呢我们也加了一个这个X所啊这时候我要是去执行的话呢,是不是就阻塞了,好,那我不这样写,我后边呢加一个叫no wait,哎,我们走起。好,这是大家你看此时的话呢,相当于是不是提示我们有这个锁的这个情况了啊锁这个情况了,我们没有呢,去阻塞是吧?哎,没有去阻塞啊,这就是他这个场景,那或者的话呢,我们还可以呢,使用叫什么呀?那刚才提到另外一个呢,是不是叫skip locked呀。
16:11
啊,Skip locked,诶,这样的一个行为,来我们这块呢,走起。大家你会发现呢,这时候呢,他就不会像我们一样no位一样去报错了,这个呢,没有报错啊,那么他就会把你没有锁定的数据呢,给我们查出来啊,因为呢,咱们刚才这块呢,是不是把这个表中所有所有的数据呢,是不是都给哎锁定了,所以这会儿呢,哎,剩下数据就没有了,所以就是一个MT这样一个场景。啊,大家体会一下好,那这时候我们去做一个commit啊,就给结束了,然后这块的话呢,我们也是哎做一个commit。啊给大家就提交一下结束啊,这就这样个情况啊呃,能理解我这边要说的这个场景对吧?就相当于呢,我们使用这两个参数的话呢,就不会呢去等待了啊不会呢去等待了啊就直接呢相当于能查呢哎就查了不能查阻塞的话呢,哎他直接呢就诶执行相应的这个行为就行。好,那么接着的话呢,我们来看一看,这个叫写操作啊啊写操作,这个写操作的话呢,其实就是增删改呗,对吧,哎,就这个增删改好,那么增删改这块呢,没有什么疑问,咱们上面说这个读的时候,你注意哈,咱们说读的话呢,诶其实既可以加上啊,这个叫共享锁也可以呢,去针对我们这个毒呢,是加这个排他锁,但是我们这个写的话呢,没什么可谈的啊,就一定得是去加这个叫排塔索了。
17:27
X锁是吧?好的,那么我们先看一下啊,针对这个叫delete的这样个行为啊,Delete这个行为呢,其实我们就是去B加数里边呢,是不是找到这条记录啊,然后把这条记录的话呢,我们呃标识上叫delete mark,在这个行记录上的这个字段上加上一个delete mark从零改成一表示呢,我们把它给删掉了是吧?那么在这个过程当中呢,我们加的是一个X。或者呢,你也可以理解成呢,就是我们针对于这个读的方面呢,是一个X所啊,就相当于是我们上边这种啊这样的一个场景啊,因为这种场景的话呢,它也是排他的,只要看到这个X,那就是排他的啊OK好,那么这是叫delete了,那么update呢,诶我们说呢,对于一条记录呢,做这个update这个操作呢,分成三种情况啊,第一个说呢,你没有修改这个记录的键值。
18:11
啊,键值什么意思啊,你比如说我们现在呢,针对的假设是这个主键呢,去进行那个呃,Update操作,其实你也得先做一个查找,诶在你这个主键的这个去速索引里边,你看你要不要改当前你这个主键值呢?啊,如果不改啊,就是这个意思啊,不改这个主键值,你改的是这个,呃,记录当中的其他这个字段啊,那这时候又分成呢,就是其他这个字段呢,占用的存储空间跟这个改之前呢,有没有变化啊,没有变化是这种,有变化呢是这种。那么呢,就是改这个,呃,记录的键值呢,是这个第三种啊,这三种情况啊,好,那我们也不修改这个键值,咱们的这个用的存储空间呢,这个修改前后呢,也没有变化啊,那这时候呢,其实就相当于我们在这个原有的这个记录的位置上呢,就直接去修改这个字段了。啊,直接呢,去修改这个字段就可以了啊,那么在这个修改的过程当中,我们加上了一个叫X叫排查素啊,或者你也可以看成是针对这个读的一个,诶排查素是吧?好,那么你要是去修改我们这个,诶不是修改了,就是你修改这个数据呢,导致我们前后的这个存储空间呢变了。
19:12
哎呀,存储空间变了,那这时候呢,就要麻烦一点,你需要呢,彻底的删除掉你原有的那个记录啊,那其实呢,就是把它呢,放在我们这条垃圾链啊列表中了啊,诶彻底的删除这条记录,然后呢,我们再插入一条新的记录。啊,它其实是两个过程能理解吧,那么我们彻底删除旧的这个过程,那旧的这个记录的过程呢,我们加上一个叫排他锁,然后呢,插入这个新记录的这个时候呢,诶其实我们是一个隐私的一个行为,这个隐私行为呢,是由一个隐视所来进行保护的啊确保呢,就是你在隐私的时候呢,不会被其他这个事物呢,诶看到啊,你这个呢,在没提交的之前是吧?诶不会被其他这个事物呢看到啊就这样个情况。好,那么情况三的话呢,就是你要修改这个记录的值了,你想想我们这个呃句俗索引里边,你最后呢,要改这个ID,把ID呢从一改成二啊,你要修改值了,那这时候其实也是你得把原来这条记录呢,先得删掉啊,然后呢再做一次隐私这个操作啊,那么删掉的这个过程呢,我们加上了一个叫排查锁,然后隐私的时候呢,自动呢也会去加一个叫隐视锁。
20:13
啊,没有提交之前其他事物呢,看不到。好,关于我们这个隐色这个情况呢,我们说一般情况下呢,诶是不需要呢去加锁的啊,能理解吗?啊,因为你想想的话呢,我们前面这个delete啊,是已经有一条数据,我们要把它delete了,咱们给它加锁update,不对的话呢,是已经有啊一条或者多条数据,我们给它加这个X锁了是吧?但是你隐射的话呢,这个隐射之前它都没有这个呃抓手是吧,没有这个实体的东西,所以你就没法给他去做这个枷锁的行为,这个大家能理解吧,所以我们一般呢,就不加锁了啊,但是呢,他在这个射的这个过程当中啊,我们还得有一个隐私的一个锁呢,去保证什么呀,保证我这个隐私的,我还没有呃添加这个数据呢,我对应这个事物还没提交呢,你别的事物呢,你不能来访问我是吧,你要访问我,我的话呢,这不就出现这个隔离性的问题了吗。对吧,诶所以呢,就是咱们没有办法去抓手去加锁了,但是呢,我们会有一个隐视锁来保证,呃,他在提交之前呢,不会被别的这个事务所访问。
21:09
啊OK,好,那么针对这个,呃,增删改这个行为呢,咱们要是泛泛的来讲的话呢,那其实就是需要呢,加上这个叫X锁,就是这个排他锁是吧?诶只不过呢,细节来谈的话呢,就是我们的update也好,Delete也好呢,是真正的加X锁了,而我们这个隐私这个操作呢,因为你没有具体的抓手,你找不到这个,呃,你在这个添加之前,你哪有这样的一个。记录啊是吧,啊,那这时候你就没有办法去加这个X锁了啊,我们当然说呢,有个隐示锁啊去保证啊范范理解呢,你就知道呢,就是诶操作这个写操作啊X锁啊这样说呢,也没毛病。OK,这呢,就是咱们说这个写操作的这个行为。
我来说两句