00:00
行,那么刚才呢,咱们属于文字上的一个描述了,下边呢,我们通过一个实操的方式,让大家去理解一下,这个实操的话呢,我们这样来做,哎,我先呃问二一下,然后调入我们这个命令行,命令行我们这样啊,首先呢,我先MYSQL一下,叫杠u root。哎,RT啊ABC123,现在连接一下咱们这个,呃,系统用户啊,叫root用户了,哎,然后呢,此时嗯,怎么着呢,我们用root用户代表其中的一个事物去操作,哎,你可以想象成就像一个线程一样啊,然后我再起一个用户,两个用户呢,各自一个事物去操作我们数据库中的某一张表中的数据。那现在呢,我们只有录的用户,咱们就可以再去创建一个用户,在创建一个用户的操作呢,我补充到下边了,涉及到我们如何在MYSQ当中去创建一个用户,以及呢,赋予这个用户相关的一些权限啊,这个操作都有啊,这块就直接来写了,我们create一个叫user啊,不妨呢,我就叫做Tom了,然后呢,Identified by啊就相当于是识别它为啊就是一个密码了,ABC123,我密码一样了啊哎,分号呢,结束我们这个操作执行,相当于我们现在就创建这个用户叫做Tom,他的密码呢是ABC123,那我现在呢,在诶WIN2一下启动一个新的命令行,这时候呢,我就卖S-U。
01:20
屁。那这个我就直接把密码写后边了啊,然后回车一下。哎,我们刚才创建了用户,这时候呢,我们就使用这个Tom用户呢,登录了我们这个MYSQL这个服务器了,登录完以后,这时候呢,我们在咱们的右边是咱们这个root用户啊嗯,我先呢叫show data basis,看一下我们当前能够识别的操作的这些数据库都有哪些,显然呢,我们这个系统用户呢比较多,看一下左边。Show data basis左边呢,就一个这是默认提供的,那我们现在呢,想修改咱们这个test,针对于咱们test这个数据库下,比如还是针对这个user table这个表来讲,咱们比如说看这个CC用户,CC用户呢,他的balance呢是2000,咱们呢,通过这两个用户的两个事物去操作这个2000块钱来查看一下这个事物的隔离级别,隔离性的问题,OK,只是咱们做一个演示了啊,那这块的话呢,我们左边目前情况下呢,这个Tom用户呢,是没有权限对咱们的test数据库下的任何一个表进行操作的,没有权限,这涉及到权限问题了,我们通过系统用户呢,可以给他赋予相关的权限,这个权限的赋予方式呢,在我们这里边儿有,哎,这叫grant这个方式。
02:33
啊,这个我就直接在这写了啊,这个grant我们来一个,比如说查询insert。Update delete on on,咱们test这个数据库下的所有的表,To给谁呢?给Tom Tom针对是咱们这个local host的这个数据库,哎,然后最后呢,你得把这个identified啊,BY把这个密码呢,再写一下啊,ABC123OK。
03:00
啊,这个我就赋予赋予权限啊,这叫grant也是一个DC的操作好这个就写完了啊,这个写完以后呢,回到左边,我们此时呢,再去收data,诶,我们就能看到这个叫test这个数据库了。没问题是吧?哎,然后左边的话呢,我们先use一下这个叫test这个数据库啊右呃,左边呢,也是use一下test数据库啊,因为你这个有好几个数据库哈,比方说我们现在要操作哪个数据库了,哎,我现在操作是这个test数据库,然后此时呢,我们先select形from啊,User table。Where?哎,这个user等于。CC是吧?这我们查看了一下CC,它目前呢是2000块钱,哎,然后左边呢,我们也可以做这样的一个操作啊。诶,Select行,From user table where user等于CC啊一两千块钱,好,你这时注意啊,我们这写的两个起带的操作,咱们说这也算是DDL操作了,默认情况下,这个DDL操作呢,按DML操作,默认这个DML操作是不是自动提交了,提交诶其实我们只要一提交,其实咱们刚才也说事务了啊,说事务的话呢,得保证你这里边的几个操作是不是要么都是要么都不执行,那其实我们可以认为只要是你这块提交了,其实我们就单独的就把这一个查询语句是不是就看成是一个事物了啊。
04:26
那也就是我们刚才这个其拉克操作,你执行完以后呢,这个事这个事物就完事了,那我们现在是不是想演示说这个事物在操作的时候呢,这个事物怎么着,你是不是得不能让他事物结束,不让他结束怎么办呢?我这个链接现在始终还连着呢。连接没有断,你只需要呢,Set auto commit是不是改成一个false。理解吧,诶不让这个,诶我们下边的DL操作呢,自动提交,这保证你这个事物不就没有断吗?这个左边也这样。
05:01
别这样做。哎,就是下边这个操作呢,我我给大家演示就行,大家下来呢,其实也没有必要自己去演示了,哎,你就能听清楚,我们通过这个实操呢,去演示一下,咱们所谓的这个叫隔离级别,看看到底怎么回事就可以了啊所以这块呢,大家你注意看,我现在两边都是赛道auto commit等于false了,在这种情况下啊,前面也没涉及到任何操作了啊,咱们这时候我做一个select星,诶from user table啊where user等于CC。哎,咱们先这样吧,我先咱们看一下目前这个隔离级别啊select,哎,我们这个两个艾特操作,然后TX啊,然后isolation。哎,这不是咱们说的默认的MYSQL叫repeat吗?啊,这叫可重误读啊,左边这块其实你就没有必要看了,因为他俩肯定是一样的啊,Select看一下啊as,哎,这不叫repeat OK,没问题,然后下面的话呢,我们来演示一下,说这个叫repeat,这个隔离级别,它到底能够避免脏毒和不重不可重复读是怎么来看待的,我们先做一个查询。
06:07
说select星from user table where user等于CC好执行2000块钱,注意,这时候我们又自动提交,意味着我这个事物是不是还目前在。开着状态对吧,OK,然后左边左边的话呢,插一眼也行。还是2000,这个呢,15也没有关,因为我们auto commit等于false了,这个情况下我进行一个update。Update user table set balance等于我改成3000说where user等于CC。相当于我把这个CC呢,是不是改成3000块钱了,回车一下。改完了,改完以后的话呢,我们自己来查一下多少钱,自己查肯定3000了。这时候注意我没有提交数据吧,没有提交数据,那我们这块呢叫呃可重复读,可重复读是不是能避免脏读啊,既然你没提交我这个呢,能读出来3000吗?读读出来吗。
07:08
肯定读不出来,所以还是2000没问题吧,好现在呢,我提交了,我提交了啊,那就意味着这时候数据库里边是多少3000块钱,数据库是3000块钱,那我这块呢查呢。多少钱千两千,为什么哎,因为呢,对我们刚才演示的那个,呃,是2000呢,是我们想因为我没提交嘛,咱们想演示避免脏堵了,因为你没有把人家没提交数据读出来避免了,然后提交的话呢,这块还没出来,这我们避免的叫可重复读。因为你还在这个事物当中,即使他提交了你这块两次读它也是2000。那怎么他就能读出3000呢,把你当前这个事物啊,我一提交,其实就意味着我当前这个事物结束了,我一结束了,我这时候呢,我相当于是又进来了,是不是就3000了。
08:06
理解是吧,哎,就相当于我一提交,类似于大家你打开浏览器,你把浏览器关了,你又再重新进入一个网站,那就相当于又重新来了一个连接啊,这时候你再查,这就是新的了,也就是说我们这个叫repeatable read,哎,它呢能够解决脏毒和重复,呃,这个不可重复读的问题了,那下边呢,我们给大家去改一下,这个叫隔离级别啊,我要改隔离级别了,修改这个隔离级别的操作呢,我们在这儿。上面这个啊,这个咱们就别光改他自己了,咱们把这个通过root用户呢,把咱们这个Tom用户呢,也给他改了,叫set global transaction isolation level,然后呢,Read committed啊这个set global transaction。Is level这个我们改成叫read这个。
09:00
写完了,写完以后的话呢,我们这块呢,先执行一个叫,诶看一下当前这个隔离级别啊,一执行还是叫repeat read,哎,这时候需要注意问题就是我们需要把当前这个连接给他。断掉啊,重新再进入才可以,那我这块呢,CTRLC一下啊,这叫close了啊,这不又回到这个C盘目录下了,我们重新的在MYSQL-U啊叫root,然后杠P啊,ABC123啊再进来,再进来以后呢,我们再执行刚才这个叫哎,查看隔离级别,这时候叫read commit。那叫哎独立提交啊,然后左边这块呢,我们也是,诶在没有关闭,就是你把当前这个用户呢,得退出一下啊,在没有退出的情况下呢,我们查看一下这个所谓的隔离级别啊,还是叫repeat read啊,CTRLC啊,Close是吧,关掉,然后再重新进来啊MY。哎杠u com是吧,哎杠P啊ABCD23。打进来了。啊,进来了,进来以后呢,我们再查看一下,这个叫隔离级别啊,叫read committed了,OK,现在呢,叫读已提交。
10:04
读已提交啊行,那咱们因为是又重新进来的,所以再记着写一个叫auto。Commit等于false。哎,左边呢也一样。行,这时候呢,我们都没有去让他默认提交数据了,在这个情况下呢,我们还是右边这个系统用户,我先呃use一下咱们叫test这个数据库,然后呢,Select from user table where。UC等于CC。好,这时候CC呢是3000块钱,然后左边也是先use一下T的数据库,Select行,From user table where。CC。哎,好,这时候数据库里边呢,就是写了3000块钱,这时候呢,注意我们这个事物没有关,这个事物呢也没有关,在这个情况下,我现在演示一个叫update table set。
11:11
改成4000块钱,Where user等于CC。好,我把这个C呢改成4000块钱了。改成4000块钱,注意我这会没提交啊,左边查多少。3800,嗯,3000对吧,然后现在呢,我左边没提交,刚才那个没提交啊,我先提交了。这块呢,诶这块一查是不是就4000了,因为咱们把隔离级别给改了,改成叫独已提交了,就是你这块你这块你只要提交了我这块查呢就能出来,对吧?诶这个呢,相当于咱们没有解决的是那个。不可重复读的问题没有解决的是不可重复的读的问题,因为你看我在同一个这个事物当中,我还没提交的情况下呢,两次读发现不一样了,咱们把这个问题不是刚才说的叫不可重复读嘛,哎,但咱们现在呢,不是改成隔离级别叫读已提交嘛,它就没有解决这个问题,对吧?咱们那会儿呢,演示这个repeatable read的时候呢,这边你左边提交了,我右边这块不还是那个没变的那个数,现在呢变了,哎,这叫read committed,实际上呢,我们说这种情况我们就可以接受,所以Oracle呢用的叫read committed。
12:23
没问题,那我们接着再改。我把右边这块呢,我先给他set global transaction。Isolation。啊,这个level叫read an committed叫读未提交。执行成功了,然后这时候我们CTRLC再退出,再进来my circlel-URO-PABC123,好,此时呢,我们查看一下select select。
13:02
Isolation。啊,这叫读未提交。哎,左边这块呢,也是我们CTRLC退出,然后再进来。那磁口杠u Tom-PABC123,此时呢,在三,嗯,这个select。An isolation啊,Read uncommitted就是读未提交。这个呢,脏毒是避免不了的,好脏毒避免不了好左边先从右边开始啊,先use一下test这个数据库,然后呢,紧接着叫,呃,这个set auto commit等于false,不让他提交,然后左边也是一下啊,右一下test这个数据库。Set auto commit false。行,然后呢,在右边我们先select行。
14:02
From user table where user等于CC。4000块钱。这是数据库里边,目前呢,就是4000块钱左边。也先查看一下。还是4000块钱好,左边呢,我们给大家做一个update。5000 where u等于CC。嗯,Table写错了。现的这改成5000了,这个改成5000的时候呢,注意我此时没有提交数据,右边呢,我现在去读5000。啊,那你你这个5000实际上是临时且无效的,因为左边的没提交你就读进来了,这叫脏读,哎,那么这个时候呢,左边是不是可以roll back回滚了,然后回滚以后呢,我自己查我这块。
15:06
这还是4000,那你这块呢,我回过来你这块你查一下肯定也是4000了啊,但是你刚才读的这个呢,就是临时且无效的,就是脏毒问题没有避免,就这个事呢,是不应该出现的。啊行,那这块呢,就来演示一下这个脏组的一个问题,那我们在开发当中呢,实际上咱们只需要用这个叫read committed,其实就可以啊,其实用它就可以,当然呢,MYSO呢,让它这个一致性呢更好一些,哎,所以用的叫read啊就是repeatable read是吧,可重复读,行,那这个呢,大家呢,能清楚这个事儿,刚才呢,我们演示的这个操作呢,只是呢,把刚才这个过程呢,给大家说明了一下,验证了一下啊。
我来说两句