00:00
好同学们,那么在这个可重复读啊这样的一个隔离级别下呢,咱们就给大家去演示一下,确实呢,这个脏毒解决掉了,然后这个不可重复读呢,诶也给解决掉了,但是的话呢,我们说在诶repeatable read这样的一个隔离级别下呢,是不是诶提到了一个换读问题呢,是解决不了的,对吧?诶那么这块呢,是不是就可以考虑给大家去演示一下这个换读这样的一个问题,对吧?诶那么讲这个换读的时候呢,大家首先呢复习一下,说什么叫这个换读啊,先我们这块复习一下啊说针对我们这块呢,比如叫事物一,这个呢叫事物二是吧,那么我们这时候呢,有一张具体的表了,然后呢,我们通过这个诶事物二的话呢,去查看一下这个表中,比如说某些记录啊,假设呢,我们符合某个条件的记录一查询呢,假设是零,比如说呢,我们去查询说ID呢,诶是三的这个记录的这个count个数,哎,这个显然是零了。哎,注意这是我们是先开启一下这个事物啊,然后呢,去做的这个C查询。好,呃,那么这时候呢,咱们这个事务呢,还没有去结束,那么在我们这个事务一里边,咱们就呢去做了一个开启事务,然后呢,我去做了一个叫insert,诶insert到我们这个表中的一个记录啊,我把这个ID为三的这个记录呢,我就给他添加上了,诶添加上以后的话呢,我这时候呢,还做了一个commit操作,相当于给提交了是吧?诶就给结束了,然后回到我们这块的话呢,我们这个事物呢,还没有结束呢,啊,那这时候呢,咱们不是查了一下ID这个等于三的这个值,这个个数呢是零,那相当于我们是不是就可以自己去隐色了,哎,我自己隐色的时候呢,结果你发现呢,就报错了。
01:30
诶那就相当于呢,就是说诶这个表中相当于已经有这个ID13这条记录了,因为ID呢,它不是一个主件嘛,不允许存放这个相同的这个ID值是吧?诶这个就报错了,相当于呢,就是诶我们在一个事物当中啊,刚开始呢,去查询的时候呢,比如这个记录呢,是零条,然后呢,当你诶另外一个事物,呃,插入了一些数据之后,我们这个事物呢,再去查询的时候,发现这个记录多了。哎,这个多了的这种行为,我们就称为呢是一个幻读,哎,下边呢,咱们来给大家去做这个演示。好,那么首先的话呢,我们需要呢,先去确认一下啊,咱们当前这个事物啊,咱们select啊叫transaction。
02:07
啊,Section啊,叫isolation。诶,然后呢,我们查看一下是不是叫read,这是没问题的是吧?啊我们这块呢,诶做一个复制来回到这儿啊,就咱们现在呢,给大家说的呢,是不是都是叫这个,诶两个事物呢,一定是在相同的隔离级别下啊,因为呢,或者叫绘画啊,绘画里边呢,这个事物都是在相同的隔离级别下,因为呢,咱们都用的是相,一定都是相同的隔离级别了。啊,那这时候呢,大家,呃,咱们这个稍微插一句哈,咱们上面的话呢,给大家讲的时候呢,是不是提到了我们呃,通过这个set的方式呢,去做的这个设置。对吧,诶咱们做的这个,呃,使用这个set方式去做的这个设置,但是这种方式呢,毕竟呢是属于这种,呃,因为你服务器重启了就没有了,属于内存级别的,那如果说呢,那你不想用这个叫repeatable read,你想呢,就改成比如叫read committed啊,那你还想着是持久是生效的啊,服务器重启呢,也得生效,那这时候你就得需要去改我们这个配置文件了,对吧?在配置文件当中,大家你可以加一个参数叫做transaction下划线叫isol,比如说你改成叫able啊,或者叫这个,呃,中华线啊这个。
03:12
诶committed呀,诶都可以,然后呢,再重启服务器,那这时候呢,它就呃起作用了,诶同学说那我重启服务器,我当前的这个服务呢,不就没了吗?那你配置文件加上以后呢,你再去set这些global对吧?诶这时候呢,诶当前呢global那个起效果,你要服务器重启来了,那这时候我们配置文件也会加载一下,那就也起作用了,诶通过这样的方式呢,达到一个持久化的一个目的。啊,这块咱们相当于插了一个这个内容啊,啊,那么再回过来。目前呢,我们确认了一下这个当前呢,诶是不是都是这个叫repeat这个read的,好,然后呢,我们在这个事物二里边啊,在这个事物二里边呢,首先呢,咱们去比begin一下,相当于我是不是开启这个事物啊,好,那么接下来的话呢,我去做这样的操作啊,What'select,叫count,呃星诶from一下我们这个count说where呢。Where?这个ID呢,等于三。
04:00
哎,走一下,哎,这时候呢,我们看ID等于三的这个count的个数呢,这时候是不是零啊,哎,没问题,好,然后这块呢,我们回到这个事物一这个层面,我们这块呢,做一个begin,然后接下来的话呢,我们叫ins色into,咱们这个叫a account。嗯,咱这叫ID name和balance是吧。好,然后呢,Value这个呢,我们写一个三啊,比如说这个叫张三李四王五吧。哎,然后呢,再逗号一下啊,来一个比如100。行,哎,走起,那这样的话呢,是不是我们相当于把这套数据呢,就插入到咱们这个表当中了啊,那你此时呢,去做一个select,哎,From咱们这个,诶account查看一下,诶是不是就我们这个王五这个数据呢,就已经有了,诶这个是很正常的是吧,然后随后的话呢,你是不是就做了一个commit操作呀,那我们当年的这个事物呢,相当就完全结束了,诶把这个数据呢,就写到我们这个磁盘当中了,好,那么回过来啊,那么这时候的话呢,诶,那这时候呢,咱们也这样吧,咱们起select,呃,靠清一下啊,走起。诶这时候你会发现就是说诶不对吧,诶不是说呢,增增加了一些记录,那这块应该能查出来呀,诶在我们当今这个事物当中是吧?诶这个呢,你发现并没有查出来啊,并没有查出来啊,那但是呢,我们可以通过另外一种方式呢去证明啊这个呢,确实是出现这个换毒了啊咱们怎么做呀,你刚才呢,在这个事务一里边呢,我们做了一个隐私的这样一个操作是吧?啊我这块呢,我诶咱们往前一点啊。
05:23
哎,我到这儿是吧,哎,然后我这个ctrl inr一下啊,我做一个复制,哎回过来,哎,我把这个诶粘过来,我这呢ID一定还是三啊这个呢,比如咱们改成这个,哎1000吧啊做一个区分是吧,哎我呢也想插入一条记录啊,我们这块呢做一个啊执行。啊,大家看这时候呢,就出问题了。啊,出了问题了,我们在当前这个事物开启以后呢,我们明明查出来的,你这个呃,ID为三的这个count呢是零,但是呢,我们现在往里边去引色的时候呢,它告诉我们叫dulicate了,咱们以前呢,说只要已经存在三的话呢,对于主键来讲就不能够再去添加了。
06:02
啊,明明呢,就相当于给我们一个叫唯一性约束这样的一个呃,错误的信息是吧?诶那就意味着呢,是不是我们这个表里边已经有ID是三这条记录了,对吧?诶只不过呢,咱们通过这样的方式呢,没有显示的看到它,哎有这个三的记录了,但是通过这个呢,隐示的能够证明,诶我们出现了换堵。啊,对于咱们MY来讲呢,有这样的一个特别之处,就是我们直接这样看呢,你发现没有所谓的多出几条记录,但是通过这个呢,证明确实是多了记录了。哎,多了几轮啊,这呢就叫做哎换读。啊,那这既然出问题了,咱们针对你当地这个事物,你不能这个尬到这儿啊,那我们就做一个roll back吧,相当于这个事物呢,就做了一个终止的这样的一个操作。完事了啊,这个呢,就咱们所谓的这个叫哎换堵啊叫换读,那出现这个幻读的话呢,其实也感觉差点意思,为啥呢,你看明明我们这时候呢,在当前这个事物我开启的时候呢,查看你这这个时候呢,是确实是没有记录的,对吧,这个大家注意啊,这是确实没有记录的,然后呢,咱们呃在这里边呢,相当于是加了一条记录,那这个时候其实按说不应该这个事儿了,咱们就忽略这个事儿啊,本来呢,我现在开启事务呢,查询你确实没有,诶我们但是往里边去插入的时候呢,你告诉我报错了,我这个事物我可没关啊。
07:12
你要是我关了这个事物了,我再去,呃,隐射的,那那那是另外一说了,对吧,我没关。嗯嗯,差点意思,所以这块呢,我们说这个换读的话呢,你也可以考虑呢,去解决一下这个问题。啊,那要解决这个换读的问题啊,按照咱们前面讲的这个情况呢,咱是不是得用一下叫ible这样的一个隔离级别了,但是这个隔离级别的,你看这名字哈,哎,S是不是就串行的意思啊,那都串行了,那你想想我们这个想实现一定的这个并发性,这个是不是就很差了。啊,那这个呢就不理想,那怎么办呀,哎怎么办呀,哎这时候我们首先呢,给大家说明一下这个串行化,哎,它是如何来解决这个叫诶脏毒的问题的,哎不是来解决这个换毒的问题的,好来这块呢,你看一下我这个诶。写的这个课件啊,说呢,在这个C这个隔离级别下,他是怎么解决我们这个,诶所谓的这个换读的这个问题呢,诶这块提到了一个说会隐的去添加一个行的一个啊叫独占所,或者呢叫我们这个叫间隙所所呢,咱们放到下下章给大家呢具体去讲啊,这个洋爱之呢,它就是这样个场景啊,我就直接呢给大家去做描述了。
08:19
如果说呢,我们使用的是这个叫呃序列化这样的一个隔离级别,那么会出现什么情况呢?诶两个都是序列化的啊,然后呢,我们在这个事物二当中呢,咱们做这个比begin,然后我这块一查是不是相当于是零啊好,那么在这个场景下呢,我们把这个事物一呢打开,诶你呢,开了一个事物,然后接下来的话呢,你是不是想去做这个insert了,我想把这个IDV3的这个数据呢,给它添加进去,好当你执行这个数据的时候呢,呃,它就会不会让你啊去执行。啊,他不会让你去执行,就相当于呢,这时候呢,呃,因为啥呢,我们当前这个事物二呢,我们是做了这样的操作,他就会把ID为三,相当于这个数据呢,给它做了一个,呃,锁定了。啊,锁定以后呢,其他的只要你想去改这个IDV3这个记录呢,它就不行,他就这块呢停留在这儿,就跟我们那会儿呢,见到这个场景一样,这块呢它就不往下走了。
09:08
对吧,我们演示诶是前面那个情况的时候呢,是不是出现过这个场景,它就不往下走了,然后的话呢,诶我们这个事物的话呢,如果你接下来呢,再去查发现还是零,你要去隐射的话呢,诶我们就让你把这个数据呢,就添加成功了。你添加成功以后的话呢,你就想做一个commit是吧,好你commit吧,你commit以后相当于我们这个事物呢就结束了,然后回到这块呢,你1COMMIT这个立马呢这块呢,诶它就不会在这儿呢去阻塞了,呃相当于你那边呢释放锁了,然后他紧接着要去执行,但一执行发现人家呢这个事物二呢已经把张三呢给写进,把这个IDV3的数据已经写进去了,然后在他这块呢,会报一个说诶wlic了。啊,就是相当于这个信息啊,会报的,我们十五一这块相当于你添加不成功啊,为啥呢?因为人家是先开启事物去查看,然后呃去操作这个三了,所以这块呢,我们在事物二这块呢,就锁已经锁定了,哎,你这个事物一就不让你去这个再隐私了,那这时候我们就避免了,是不是出现这个换毒的问题了。
10:08
对吧,诶是这样啊,诶但是呢,回到这个刚才说的这个问题上,那我们要这个able的话呢,这个性能呢,是不是比较差,那怎么办呀?诶这块我们提到说在这个repeatable,这个read就相当于MY的默认的这样一个隔离级别的情况下呢,它也是可以避免换的啊但是这个事儿的话呢,咱们在这呢,先泛泛的一讲啊,咱们下边的话呢,要给大家去讲的是不是这个锁,还有这个m macc是吧,叫多版本并发控制,诶在这里边儿呢,诶我们就会去提到了,诶我们如何呢去解决这问题,咱们先范泛说一下啊,诶这个解决方式的话呢,其实也就相当于去加这个叫诶行的X锁,这个X所呢,其实有个独占锁了。诶他那是一个什么逻辑呢?诶还是回到这块啊,其实有点类似哈,就是当我们诶这块我说一下咱们MY呢,在repeat的情况下呢,怎么去解决这个换读问题啊,诶相当于呢,就是当我们这个事物二呢开启begin以后,然后呢,我们这块呢去做一个select,咱们确实呢,没有找到ID是三的这条记录,对吧?诶但是的话呢,我们此时呢,也会去锁定这个,为什么锁定呢?诶你说我们都没有这条记录,你怎么锁定啊?诶咱们这时候锁定呢,是按照这个索引来进行这个锁定的。
11:16
啊,针对这个,所以呢进行锁定的啊,相当于呢,你虽然没有ID是三这条记录,但是呢,它会把这个,诶,所以为三的这个记录给锁定,那就意味着当你这个事物一再去引塞的时候呢,他还是不让你去访问。哎,然后呢,你这块呢,你自己可以去添加成功。对吧,诶添加成功,然后这块呢,它这块呢,想添加它就报错了,诶就这样个场景,OK,行啊,那关于这个事儿的话呢,咱们放到这个下下长啊准确来讲应该是我们讲的这个MVCC时候呢,咱们再具体去说,诶这样一个问题,好,那么这里的话呢,咱们就给大家呢,把这个事物的这个隔离级别里边涉及到的这块呢,稍微的难一些啊,也比较重要一些,诶并发问题有什么不同的隔离级别啊,是解决这些问题的哪些情况,然后呢,怎么去理解,诶这块呢,大家也能够表述清楚啊,你得自己清楚了,然后面试的时候呢,你才能够跟面试官去交流,然后呢,你开发当中自己才能不迷糊。
12:09
啊诶,那这块呢,就属于我们啊,笔试会考,面试会问啊开发会用的这样的问题,那就是重点问题,好那么这一章的话呢,咱们就哎说到这儿。
我来说两句