00:00
好,那么接下来的话呢,咱们来看一下这个第三个问题啊,叫做事物的,诶隔离级别,哎那么这个问题呢,从哪引入呢?诶怎么突然冒出来一个叫隔离级别呢?诶大家你想咱们在前面呢,讲事物的叫acid特性,哎其中呢,提到这个I呢,叫isolation,就是隔离性的意思,咱们其实没有展开去说,对吧?诶这是一个点,另外的话呢,咱们再谈到第二个呢,说如何使用事物的时候呢,咱们不管是显示事物也好,隐示事物也好,咱们呢,其实针对于这一个事物,咱们谈到了它如何去开启,如何呢去进行多个D的一个操作啊最后呢,如何呢去commit,如何roll back啊讲到的是关于这一个事物的一个算是完整的一个生命周期,对吧?那我们在实际情况当中呢,是很容易出现这样的场景的。你比如说我们针对这个表中的这一条记录,然后呢,我们现在呢,这一条,呃,这个事物呢,要去增删改它是吧?那同时呢,我们另外的一个事物呢,也想去增删改我们这条记录,而且改的还是同一个字段,那么这时候呢,该怎么办呀?诶这其实就涉及到了我们这个相当于数据的一个一致性的问题了,对吧?诶这就是我们现在要谈的,这叫诶隔离性啊,叫隔离级别的一个问题。
01:07
啊,隔离器备的问题啊,首先呢,我们这里边儿呢,有一段文字的引入,说呢MYQ呢,是一个客户端服务器端软件的一个架构啊,那这时候呢,相当于这就是比如我们这个叫DBMS对吧,就是我们这个服务器了。然后呢,我们是不是可以有很多的这个具体的客户端了,然后呢,每一个客户端的话呢,诶获取了针对我们MYSQL服务器端的一个连接之后的话呢,它是不是就可以发送这个叫请求了,对吧?那这请求的话呢,他发一个,然后后边还可以发第二个,第三个,诶那有可能就是他这几个请求呢,就构成了一个事物了啊transaction我就用个T来表示了,那么是不是还有很多的这个客户端呢,都来访问这个呢,就是这个T2,那此时的话呢,我们这些事物假设呢,他访问的是我们数据管理系统中的,诶某一个表中的,甚至咱们具体来讲呢,就是具体的这一条数据了。那么多个事物啊,其实其实具体体现的话,就是多多个请求了,对吧,只不过呢,这些请求呢,我们说它是分布在不同的事物当中啊来去体现的,那么我们如果都要去操作你这个表中的这一条记录的话呢,那我们如何呢去看待此时这种并发性的问题呢?啊,那这时候呢,如果我们允许这个并发的问题了,那是不是就有可能会导致我们这个数据呢,出现不一致的问题啊。
02:15
啊,准确性的问题是吧,诶这些呢都难以保证了啊,那这块呢,我们也可以体现为呢,叫数数据的这种叫隔离性的问题啊,相当于就出现这种隔离性跟这个并发性,我们该如何呢去权衡呢?哎,就是我们这样的场景。好,那么首先的话呢,咱们把这个呃,并发呢可能产生的问题啊,咱们阐述清楚啊,然后的话呢,咱们再看一下这个MYSQL,针对于呢这些问题,诶它呢是如何来设置这个隔离级别的啊,来权衡我们的并发性和隔离级别啊和这个隔离性。好,那这块呢,我们来看一看这个例子啊,首先呢,咱们通过这个理论上呢,咱先把这个事儿呢先说清楚,比如说呢,这里边呢,我创建了一个表,这个表里边儿呢,有这个学生呢啊number啊叫学号了啊姓名还有这个class,然后这呢是一个主见,没毛病对吧?然后呢,我们往这个表里边啊添加了一条记录啊叫小谷啊一般啊ID呢是一查询的话呢,就是这样一条记录,这都没有问题的。
03:10
行,那下边的话呢,首先我们给大家说明一下这个数据的一个并发的问题。啊,咱们先来说这个并发的问题啊,那这里边儿呢,这个并发问题呢,咱们是保证呢,诶不是这种串行执行的啊,这个串行执行什么意思啊,就是呃,我们针对这个表中的这个数据啊,你这个事故呢,执行完以后的话呢,你这个事故呢才进来,这肯定不会导致我们这个数据呢一致性出现问题,对吧?但是这种的性能呢,太低了,咱们现在要考虑的其实就相当于是他们有这种交叉访问的情况了啊说白了就是有这种,哎,我们这个并行的这样一个效果是吧。好,那么这块呢,我们来看看都可能产生哪些问题呢?呃,第一个呢,叫做脏写的问题啊,Dirty right是吧?什么叫脏写的问题呢?诶一方面呢,你看我这有个文字描述啊,说如如果这个事物A啊,这个事物A啊,就是一个事物呢,它其实也是在一个绘画当中体现的啊,一次连接中吧啊,所以这块我就写成叫section a了啊啊如果这个事物A的话呢,他修改了另一个未提交事物B修改过的数据。
04:11
啊,这就意味着发生了这个脏器。啊,未提交的事物修改过的数据,那未提交呢,就意味着他有可能会回滚啊这样个场景来,这个咱们直接呢,看这样一个表格啊,这呢写的很清楚啊,这呢是一个事物呢,它比begin了啊开启了一个事物,然后我们这个的话呢,它也开启了一个事物啊针对我们这个来讲呢,它首先呢,诶咱们原来那个字段呢,是不是叫小谷是吧。然后呢,我们在这个事物B当中啊,咱们把这个小股的一个名字啊,咱们改成了叫李四了。啊,改成李四了是吧,然后改完以后的话呢,诶这时候呢,我们通过这个这个三神A啊,这个事物一呢,哎或者叫事物A是吧,我们把这个呢也又改成呢叫张三了啊相当于这个小股呢,改成过李四,哎然后呢,是不是又改成这个张三是吧。那改完以后的话呢,你这块你还做了一个commit,相当于呢,就是我改写了成功了,而且呢,我还诶提交了啊YG呢,就是我们非常确定的这个数据呢,应该是已经刷盘了。
05:07
啊,但是啊,但是是吧,我们这个赛神B这块呢,人家呢,又做了一个回滚,诶人家一回滚的话呢,是不是就回滚到他诶之前的这个操作这了,相当于呢,这个他的这个李四操作就白扯了,他又回滚到这个小股这儿了。啊,他要回访到这以后呢,这个呃要15A呢,他一去查询说哎呀我都改成张三了,我也commit成功了,我select下1SELECT you小股出来了。是不是蒙圈了?哎,这个呢,我们称为呢叫脏血的问题啊,这个问题呢,其实挺严重的。啊,其实挺严重的啊,就相当于我们都提交的这个数据呢,竟然都被给回滚掉了是吧?诶这个很不靠谱啊,这叫脏血。好,什么叫脏读呢?啊,叫dirty read。啊说呢,这个事物A它读取了已经被事务B更新,但是还未提交的字段啊,因为你没有提交嘛,所以之后呢,若这个事务B呢,它回滚数据啊,15A呢,读取的内容就是临时且无效的。
06:00
啊,这个大家呢,如果第一次呢,接触这样的内容的话呢,看着会有点生疏啊,咱们还是举这个例子啊呃,这呢我就先不去演示了啊,因为我们要演示的话呢,得在具体的隔离疾病下呢去演示,咱们现在把这个理论呢先说清楚啊,一会儿呢再演示啊。好,这呢是我们这个10A啊,这呢是我们这个10B。啊,这呢,比根开启了啊,这个比根也开启了,然后紧接着的话呢,我们这个呃,事故B的话呢,他把我们这个表中的这个数据呢,这个改成这个张三了是吧?原来的这个叫小谷,然后呢,改成那个张三。好,改成张三了,改成张三以后的话呢,这个注意他没有提交数据啊,他没提交,然后呢,我们这个诶事物A呢,他就去读了,他一读呢,你看他竟然把这个啊事物B当中啊,这个临时的这个数据呢,他竟然给读到了。哎,相当于他读出来的不是小谷啊,正常来讲,我们这个磁盘当中呢,是不是写入的还是小谷对吧,但是他没有读出来小谷,他读的是张三。啊,他读的是这个张三啊,你提交你提交呢,其实没啥用,这是我们也没修改数据是吧?啊相当于这个提交呢,意味着我们把这个呃15呢,相当于给结束的一个意思啊。
07:07
然后的话呢,我们这个section b的话呢,它就做了一个roll back,哎,因为我也没提交,我就可以roll back,我1ROLL back呢,相当于是不是我就哎就是把这个小股呢,是不是又给诶回滚回来了是吧?诶又出现小股了,那我们刚才呢,这个读取的数据呢,相当于你读了一个人家没有提交的数据出来了,这个呢,我们称为呢叫脏读。啊,叫做脏毒啊,这样的一个场景。啊,这个注意啊,就是相当于是呢,读取了啊,被另外一个事物更新,但是没有提交的数据啊,这个呢,就是脏毒的意思。好,那么下一个问题呢,叫做不可重复读啊,那repeatable read不可重复读,那杨伟这你要重复读怎么着了呢?哎,就出问题了是吧?哎,说这个事物A啊,它读取了一个字段。然后呢,这个事物B啊,它更新了这个字段了,哎之后呢,你这个事物呢,再去读这个字段呢,发现诶这个值不一样了。有同学可能会想说,这不是很正常吗?哈,诶,这呢是我们从这个并发问题上来讲呢,它也算一个问题啊,至于说你所谓的这个正常啊,是因为呃,咱们平时呢,在开发当中呢,咱们就诶没有考虑它这个并发问题啊,咱觉得说这个问题呢,是可以接受的啊,是这样的,但但不意味着它不是个问题啊。
08:15
那么具体这个代码演示的话呢,就是这样子的,呃,首先的话呢,我们这个呃15A啊b begin呢,然后呢,从我们这个表里边呢,读了一个数据啊,这个ID为一的这样个数据啊,这时候假设呢,我们此时呢,存的是这个王五啊。好,那他家呢,就把这个王五呢给读出来了,那读出来以后的话呢,来注意这时候呢,我们这个section b啊,这个section b相当于我们这个事务B,它呢就做了一个update的一个操作。Update呢,相当于把我们这个王五呢给改成这个张三了,大家注意改完这个张三以后呢,我们做了这个commit了啊。啊,Commit是相当于提交了是吧,好。呃,这个相当于我们默认的场景auto commit呢,相当于就是个触嘛,就commit提交了,哎那么提交以后的话呢,你看我们这时候呢,这个呃事物A他要再去读的话呢,他就把这个张三呢,哎给读出来了。
09:01
哎,相当于你把这个另外一个用户呢,已经提交的数据呢,给读出来了,说哎呀你看我刚开始读的是王五,我一会儿又读的话呢,结果成张三了。啊,然后呢,你这个李四呢,要改再改一次呢,我再读就成李四了。啊,那就相当于我每次重复去读的时候呢,发现这个值呢都不一样,诶我们把这种问题呢,称为呢叫不可重复读。啊,想必有同学呢,这块可能有点懵,说你这块不应该就是这样子的嘛,啊这个呢,是因为咱们啊,你涉及到的点就是我们在平时使用这个数据库的时候,认为这个问题呢,是不重要的是吧?诶我们只是说呢,就诶觉得这个可接受的而已啊诶你先理解一下我们这里边这个问题啊。好,那接着我们再提一个下一个问题,叫做换读。幻读啊,跟出现幻觉一样啊,什么意思啊,说我们这呢,有一个叫事物A啊,它从一个表中读取了一个字段,然后呢,这个事物B啊,在该表中啊,插入了一些新的这个行。哎,插入了,注意这是插入行为啊,我们上面是不是一个更新行为啊啊,插入了一些新的行之后呢,如果这个事物A呢,再去读取同一个表的时候呢,发现就多了几行。
10:04
那跟出现那个幻觉一样啊,哎,这个呢,就叫做幻读。啊,那这呢,更有同学会说那你不正常嘛,是吧,人家这个表呢加,呃这个时候呢,加入一些行,你再读可不就多出几个啊,这个呢,只能说呢,还是那个问题啊,我们平时呢,在处理数据库诶隔离性问题的时候呢,咱们就没有考虑这个问题,或者咱们认为这个问题是可以接受的,但是呢,我们得先认可这是一种问题啊,从这个图表上来解释的话呢,就这样子的说,这个事物A的话呢,他先去读读这个ID呢或叫number呢,是大于零的啊,比如我们这时候就只找到张三了。哎,只找张三了,然后的话呢,我们这个事务B的话呢,它往里边呢,还插入了一个叫赵六。诶他把这个照六呢给插入进去了,他说插入进去以后的话呢,诶相当于他这块呢,也会有一个自动的一个commit操作啊相当这个数据呢,他给提交了,然后呢,我们这个15A的话呢,他再去读这个number呢,叫大于零的发现呢,诶张三和赵六呢都出来了。那感觉跟发生了一个幻觉一样,说一开始呢只有一条记录,结果我们再去查询的时候呢,发现只有两条记录了,那多了一条照六的记录,那把多的这种行为我们就称为呢,叫做幻读。
11:08
它叫做这个换度。啊,这个注意一下,呃,那么我们新插入的赵六的这条记录呢,我们自然而然的就也称为呢,叫做哎,幻影记录。哎,这叫幻影记录,就是多的这个记录啊。哎,这里边儿呢,我们有两个注意点啊,需要大家去关注一下啊。比如有的同学呢,会疑问说那我们这里边是表示叫插入一条记录,那如果说我们这个section b里边删除了一些记录呢?啊删除了一些记录,然后呢,我们在通过这个section a呢去查看的时候呢,是不是就记录变少了呀,说这算不算换读呢?注意这不算啊,因为咱们上面写的是插入了一些新的行。然后呢,我们还有这个名呢,哎,新插入的叫幻影记录,那你删除的这个呢,就不算了啊,这个要注意一下。大家要注意一下啊好。啊,就是相当于我们这个换读呢,它强调的是呢,我们在读的时候呢,多了一些东西啊OK,然后第二种情况呢,就是说,诶对于先前呢,我们查到这个数据之后呢,又读取不到这个数据算啥了,你比如说刚才提到了,是不是删了一些数据啊。
12:07
哎,说呢,我们一开始能读到,结果后来呢又读不到了,少了一些数据,诶其实这块呢,你要非要追究呢,你可以理解成是一个不可重复读的一个场景。啊,因为你刚读的时候呢,说有这几个,那在读的时候少了啊,在重复读的时候呢,相当于做了一个变化是吧?诶这个你可以归为那叫不可重复读,我们这个换读的话呢,就是强调多了东西了啊,所以是一个插入的行为啊,诶这个大家一定要小心一点。好,那么这样的话呢,咱们就把这个并发问题呢,就讲了我说了几个问题啊。啊,是不是四个呀,脏写脏读不可重复读换读是这四个问题,好那么接下来的话呢,我们再看一下这个circle当中啊注意这时候是circle当中,咱们还没有具体提这个MY的啊也就是说呢,这个,呃,我们说这个circleq的这个官方标准当中呢,它给我们针对这四个问题啊,来提供了几种隔离级别啊隔离级别什么意什么意思啊,就是我们这儿呢,不是说有这四个问题吗?那现在呢,到底是我们这四个问题全部都解决呀,还是说呢,我们只解决其中的一部分呢?啊还是怎么样啊,诶为啥呢,这里边会涉到这个点呢?因为你要都解决的话呢,呃,这个其实呢,你要说从这个呃叫什么隔离性上来讲,或者叫数据一致性上来讲呢,那肯定是非常好的。
13:16
对吧,肯定是非趁的,但是的话呢,这样呢,其实就意味着我们整个这个并发性的话呢,就会特别差。啊,这个大家注意一下,就是你要把这个问题都解决了,并发性就特别差了。啊,这个数据的一致性啊,隔离性啊,倒是都很好是吧?啊,但是你要都不解决的话呢,诶我们并发性很好,但是呢,你这个隔离性和数据的一致性就很差,脏毒啊,这个我们接受不了是吧?啊那怎么办呢?啊,藏族当时也接受不了,怎么办呢?这时候我们就要达到一个平衡啊,说呢,你要是这个并发性的要求高一点呢,啊,那你就怎么着啊,你要并发性要求没那么高呢,你就怎么着啊,那这时候呢,我们就针对于解决这四个问题啊,这个的情况啊,我们就分出来几种叫隔离级别。首先的话呢,我们针对这个问题的严重情况呢,进行了一个排序啊,咱们认为呢,这个脏写是最严重的,他接受不了,那既然我们都commit了,然后呢,结果你一查看呢,诶,我这个数据竟然没写进去是吧,接受不了是吧?脏血脏血脏毒不可重复毒换毒啊这个呢是我们严重性的话呢,是从高到低这样来排列的,排列的啊啊那么接下来的话呢,我们这个circle这个在官方标准当中就设置了,叫四种隔离级别啊,分别对应的叫read UN committed。
14:27
翻译过来呢,叫读未提交啊,Read committed叫读已提交啊,Repeatable read叫可重复读,然后呢,Able叫可串行化啊这四种隔离级别啊,那么这四种隔离级别针对这四个问题的解决情况是什么样的呢?诶,我们刚才看到是不是有个排序啊啊,那这个排序里边呢,大家你看这个表啊,一看四个列啊,其实呢,你注意一下,我们没有脏血没往这写。啊,为什么呢?啊,因为这四种隔离疾病啊,他们都解决了脏血的问题。啊,脏写这问题呢,我们是接绝对接受不了的,所以说这四个呢,都能够解决这个脏血问题啊,我就没有往这放了啊,那么最后多的这个是关于锁的一个情况,加锁读的一个情况,这个咱们这个放到后边专门加锁的时候呢,咱们再说啊,所以这里边呢,咱们重点关注的就是这四种隔离级别。
15:15
啊,注意听啊,这四种隔离疾病呢,来解决这三个问题。啊,脏血呢是都解决了,所以就刨除它了啊,脏毒不可重复毒换毒,这是不是这个哎,我们说这个叫什么严重程度呢,依次降低啊,这个呢还比较高一些是吧,它这个相对比较低一些,所以呢,我们这块解决的时候呢,就优先考虑这个高的问题啊。那么这个叫read UN committed叫读未提交,他呢,诶能够解决脏写问题,但是这三个问题呢,一个也解决不了。啊,相对呢,这三个呢,都可能会发生。哎,读未提交,那相当于什么呀,就是我们,哎这一个,呃,就是说这个事物吧,哎这个事物A吧,他有可能会读取到另外的一个事物B。啊,然后呢,就是更新的一个数据,但是这个数据呢,他还没有提交。
16:02
啊,你读到人家的没有提交的数据了,这是一个脏毒问题,他解决不了啊,其实这个呢,我们是接受不了的,所以说呢,平时咱们呃,设置数据库的隔离级别的时候呢,这种情况咱们其实是都没选的啊,注意一下。然后下边这个呢,叫read committed。是不是叫读已提交啊?诶读以提交他呢,解决了这个脏毒的问题。啊,它解决这个脏度问题,那是不是就意味着我们说一个事物啊,我们针对这个表中这个字段啊,这一个事物A,它是不是只能够去读取别人提交了的这个字段啊。啊,你这个B呢,你你比如我们这个里边呢,叫咱们说呢,叫小谷是吧。叫小谷,然后呢,嗯这个我嗯A呢这块去读读之前的话呢,我们这个BB呢,把这个小谷呢,改成这个张三了。还改成张三了,哎,那这种注意我们AA呢,去读的时候呢,先看你这个张三你提交没,你要没提交,那我A去读的话呢,读到的还是小谷,那如果说这时候你把张三给提交了啊,那我就读到了就张三了。
17:01
啊,就是这两个区别啊,A不会在呃,B没有提交这个张三的时候呢,把张三给读出来啊,相当于我们就解决了这个脏毒的问题啊,这是它啊这个的话呢,呃,是我们说的一种隔离级别。啊,那么对于这个Oracle来讲,默认的就是使用的这种隔离级别。啊,默认的是这种,呃,相当于Oracle呢,就没有在乎这个不可重复读和这个换读问题是吧,然后下边这个呢,叫repeatable read啊这个呢叫可重复读,你看repeatable嘛,可重复的读是吧,它呢是咱们my circle,诶默认的一种隔离级别相对比Oracle的隔离级别要高一些啊就是越往下的话呢,隔离级别越高,解决的问题越多,那其实意味着他的这个并发性呢就越差,你看到最后呢,是不是都成串业化了。啊这样啊,那么这呢,我们叫可重复读啊,那可重复读呢,它解决了脏读,也解决了不可重复读。啊,那就意味着我们要是呃,这个事物A呢,他在读取了一条这个记录之后,啊,这个此时呢,我们这个事物B啊,这事物A是吧?诶这个事物B的话呢,它对这个呃这个相当于数据呢,做了一个修改啊,并且还提交了,那我们这时候呢,这个15A呢,他再去读,其实还是读的是你这个B修改之前的那个数据。
18:13
哎,修改之前的数据,相当于我们这个重复读的时候呢,这个数据呢,都是一样的。诶跟上面这个有区别的啊,这个呢是你先改了,然后你再去读啊,是读提交还读未提交的,这个是我们先读了一次,然后你改了,然后我们再读啊,这个改了你还提交了哈,但是我们这块读到的还是原来那个,你没有提交之前那个数据两次一样,哎,这叫诶可重复读。啊,这个体会一下啊,然后下边这个呢,叫做串行化啊,这个串行化的话呢,就把这几个问题呢,相当于就全都解决了啊,换读情况也不会出现。啊,那就意味着我们,呃这时候呢,我们这个15A啊,他去读这个表中的记录的时候呢,比如一开始读取了这个呃三个记录,然后呢,呃,你其他这个想对他进行修改等等啊但是这块我们要是再去读的话呢,它这个还是啊这三条记录不会多这个记录啊,或者换一句话来讲呢,我们就要串新化了,诶我现在这个啊事物A占用着我们这个表,或者占用了我们这里边这一行记录呢,诶其他的这个事物呢,这时候都得去等待。
19:09
啊,这时候已经不是并发的问题了啊,都已经到了串进化的这个场景了啊,所以在这种场景下的话呢,呃,它的其实这个什么呀,呃,性能是十分低下的,并发的这个性能是十分低下的啊这个注意一下。好,那么这呢有个图啊,就是越往上的话呢,我们这个叫什么呀?哎叫这个隔离级别越高是吧?哎,隔离级别越高的话呢,我们这个并发的性能呢,它就会越差一些。啊,这个有有利有弊呗,是吧,这样一个场景。好,那么这块呢,我们就说清楚了啊,这个并发的问题,还有这四种隔离级别,大家呢,需要能够去理解,然后用自己的语言表达出来啊,这个在面试当中呢,其实也常爱问这样的问题。
我来说两句