00:00
好,这个演示完以后啊,不能说演示完这就完事了啊,这个咱们在代码上最终呢,落脚点肯定还是到这个Java代码层面,这个代码层面呢,注意咱们现在呢,通过命令行我已经给改成叫read是不是叫uncommitted了。啊,那么这呢是通过这个命令行来进行演示的,那么同样这个情况呢,会出现在咱们这个Java代码当中,因为我现在呢,刚才那会儿设置的叫set,叫global。Global transaction就是把整个我们数据库当中这个隔离级别都给改了,那IG呢,我们通过Java代码的方式,你去获取个连接,这时候这个连接呢,是不是也应该叫read UN committed。对吧,那我们在这个Java代码层面来看一下,哎,这个隔离级别的这个问题。这块呢,应该是我们今天的一个难点啊,当然这个事情呢是非常有意义的,咱们后边呢,在学习框架,框架的时候,我们当然也会讲注解,注解的时候呢,我们要设置这个隔离级别啊,隔离性是吧?这块呢大家要清楚啊,是个重点,也是一个难点。好,下边的话呢,我们来演示一下在代码中的一个体现,代码中要体现的话呢,我们得涉及到查询了啊,查询的话呢,我们还得需要在使用上失误以后通用的一个查询操作,这个咱们找一下这个query啊,咱们先考虑呢,就查一个对象,所以呢,我就用一下这个咱们原来写的这个方法。
01:19
把它呢,CTRLC一下,诶粘到咱们还是这个transaction这个里边啊CTRLV粘过来,把它呢做一个修改,其实修改呢,就是升级为我们这个考虑上事物以后的查询的第二个版本了,只需要呢把这个链接呢给它创进来,诶这样就行,那这个链接呢,就不要在里边再去创建了,最后一定要小心关的时候呢,你也不要关,看连接呢是从外边传进来的,所以连接呢也不要在里边去关,这个呢我们可以理解为是。诶,这个通用的查询操作啊,这个用于返回,呃,数据表中的。嗯,一条记录,哎这个呢是咱们这个叫I wash,哎2.0的一个版本,哎这个呢,主要的特点呢,就是考虑上15了。
02:10
那这个链接呢,我们就相当于是从外边呢给它传进来的,OK,那么有了它以后呢,我们这样来演示咱们说的这个所谓的两个事物的问题,先写一个测试。Test这个呢,我们主要是做的一个查询了啊,关于事物相关的啊的一个select。嗯,行,我用这个呢来演示其中的一个事物,然后CTRLC,我再来一个,这个呢是来负责叫update。哎,就是来负责这个修改的,这呢,其实我们要跑起来的话呢,相当于是两个线程啊,哎,这一个线程里边做一个事儿,这个线程里边做另外一个事儿,其实呢,就针对于同一张表中的同一个数据进行操作,诶那不就相当于是来演示了两个事务问题,那首先呢,我们上边这个啊,诶我们调用一下这个get instance,它来做的是一个查询操作,哎,Gdbc us点2GET一个connection啊异常了,我们先抛一下CTRL1得到一个连接,好,然后呢,我们去调这个叫get instance,这个操作连接呢传进去,此时的话呢,我们想查的呢,还是针对于咱们刚才这叫user table,哎,那这呢有user password balance3个字段,诶既然呢我们返回的是个对象了,咱们呢,不妨,诶,就在咱们这个里边呢,我再去新建一个类啊,体现我们这叫啊OM的这个辩论思想,哎,User。
03:27
哎,PRIVATE4类型的一个user private,哎,四针类型的password。哎,这个时候呢,我就让他这几个属性名跟我们这个表中的这个字段名就都一样了,诶balance这个balance呢,用的是一个int类型的,好,我们这块呢也跟它做一个匹配,呃,Int类型的叫balance,相应的auto shift s提供构造器。代餐的改善方法?哎,全选OK,然后two OK行这个类呢,我们就提供好了,提供好以后啊,保存回来这个位置我们就是a user.class哎,S语句写一下说select,哎,Select我们叫a user啊,Password balance。
04:23
哎,From user table,然后where user等于啊这个一个哎占位符,哎这个占位符其实是英文下的啊,别写成中文的了,然后这个位置呢,我们想查的是谁呢?CC。诶还拿这个CC来说,行,那这边呢,查询以后呢,CTRL1这个我们得到一个具体的user,这个我们就打印一下这个user信息就可以了,那里边呢,就包含了它的这个balance的一个信息啊,这是我们说这个就做了一个查询操作啊,然后呢,这块呢,我们来演示这个叫所谓的update操作啊,跟我们上面呢也有一些类似啊,诶CTRLC一下,其实调的方法不一样,就只是连接一样啊,CTRLC拿过来诶获取一个连接,然后呢异常先抛一下,然后呢,我们调的呢,是咱们上面写那个叫update这个操作了,他来负责的是一个增删改啊,主要呢是一个修改连接,SQL语句写一下。
05:18
An update user set。Balance等于啊,这个我们是个障碍符,说where user等于障碍符。啊,这样啊,诶搜狗在这里边说balance等于咱们现在的数据库当中的是多少来着。4000块钱是吧。4000块钱,咱们那会儿演示的时候呢,那个左边那个Tom没有提交,最后,诶所以这块你看它是这个4000的情况啊呃,4000块钱,那我给他改成5000吧,谢谢。这样子啊行,这呢是做了一个update的一个操作,嗯,然后就没了啊,嗯,这块的话呢,你看我们这个时候,我后边补一个这样的操作啊。
06:11
Thread点一个sleep的一个操作。这个我来一个15秒吧。诶,就是它会sleep这个15秒,然后这块呢,我们再写一个,诶我们叫哎修改结束啊这样。好,这样的一个情况啊,OK,那这呢是我们要目前测试的这个事物的一个隔离性这块,这呢是获取一个连接,咱们呢,当前这个事物的隔离级别仍然是叫读未提交,因为咱们在命令行中已经进行过修改了,那你也可以查看一下是不是叫读未提交啊,其实在这个位置我们可以去调用这样一个方法,诶,这个我们直接去set out啊,连接它里边呢,有一个叫get transaction isolation,哎,Get transaction isolation就获取一下事物的隔离级别,反过来是一个in对性的值,暂时呢我们先查询一下啊,通过上面这个OK。
07:03
好,查询出来结果呢是一啊这个呢,数据库里边呢,写的是4000,那一到底是哪种隔离级别呢?我们去对去连接里边找,哎,这个隔离级别不能叫脏毒了,脏毒是那个问题是吧,隔离级别是我们下边这四个啊哎,说隔离级别说这四个,你别说这四个这三个。那针对的是解决这三个问题啊,好在这个连接里边呢,它有几个常量。就这四个常量,第一个叫uncommitted就是一,那我们刚才这块呢,恰好就是一,那说明呢,咱们这个叫读位提交。哎,属于这样的一个隔离级别,OK,呃,这是我们说叫获取。哎,当前连接的隔离级别,嗯,就是这个事啊,行,那么这块呢,我们再去做这样个操作啊,叫set auto commit,这个我们改成个false,保证了我们当前这个查询呢,现在还是在这个事务当中啊,这个设置啊,或者叫取消啊,这个自动提交数据。
08:10
就是让它等于false以后呢,就保证我们这个执行的时候呢,你这个呃,当前事物没有断啊,然后同样的我们这个CTRLC一下,呃,这个我们在诶这个位置也给大家补一下啊,这块我就不测试说你这个当前事物的隔离级别是什么了,这俩肯定是一样的,OK,那么咱们这块呢,做这样的一个演示哈,咱们当前呢,是叫读未提交,读未提交,现在的话呢,我们这块呢,确实也没有让他在执行完update以后呢,去提交数据连接呢,也没有关啊这样的,哎先目前我们开始了啊查询一下。这时候呢是4000块钱,然后我们把这个呢打开。相当于我们下边这个就进行了一个update的操作,Update操作完以后呢,紧接着我们上面呢,再进行一个查询,这个是不是出来5000了,因为你是脏毒问题没解决嘛,哎,我们这没提交就5000了,然后你看我这块呢,是不是有15秒钟的时间。
09:06
啊,15秒结束了,咱这呢,这不有两个这个窗口吗?上面这个update这块就修改结束,15秒结束了,在结束的时候呢,你想我们这个提交是不是最后也没有提交。我们这个链接呢,其实咱们连接也没有关你这呢,也没有显示的去提交,那这时候呢,我们再去查呢,你刚才查的话呢,是不是5000。是吧,然后呢,就说由于你下边也没有提交,所以我们这块呢,通过这查查是不是就还是你数据库里边那4000了,哎,其实你刚才这个就是无效的,那我们要通过这个控制台这块,你要去刷新的话,这是多少钱,是不是还是4000。没变对吧,哎,就还是4000啊行,那这个呢,就是我们说你当前是个脏组,这个不靠谱啊,那我们呢,可以怎么办呢?既然这块有个叫get transaction isolation,那我们就有办法呢去set,诶我们可以在代码当中去设置诶数据库的隔离级别。
10:09
那个类级别,那怎么做呢?还是拿这个连接点,我们叫set transaction isolation里边写一个int型的值就行,但这个数呢,通常你都记不住,所以呢,咱们一般都是写的是这个常量名对吧?第二诶,我们其实设置成叫读已提交就行。哎,叫read committed,咱也没必要给它设成这个叫repeat啊,注意提交。好,那么虽然咱们当前整个数据库的隔离级别呢,哎是独未提交,但是呢,我们当前这个连接我就设置成叫独立提交,那么这个时候呢,我们再来演示啊,我们先把这个上边这个链接查询一下。啊,这时候呢,你数据库里边就是4000,查询的就是4000,然后把下边这个呢,运行起来,相当于我们给他改成5000了,此时呢,我们再去查,跟刚才就不一样了。这时候我们查出来就还是4000,因为我这个叫独一提交,你这个呢,不是没提交吗。
11:05
哎,就这样子,然后当这个15秒过了以后,哎,这15秒结束了,这是咱们当前演示的是这个叫update这个啊,诶执行结束以后呢,我们再去查是不是还是4000,哎这样的话呢,就能保证我们前后呢查的都是4000,这是一致的,就能避免这个脏毒问题,总结一句话就是大家呢,把我们刚才的这里边提到的这几种隔离级别,针对这个问题呢,大家能够清楚就行,控制台这个命令行,刚才那两个演示呢,大家听一听能理解就可以了,下来没有必要自己演示,那么最终落地呢,是需要大家能够掌握的是这个事,我们在Java代码层面是有能力设置当前数据库的隔离级别的。那么我不管你当前数据库你的隔离级别是什么,但是对于我来讲,我只需要保证你是一个避免丧组的就行,所以我们在代码层面,大家在需要的情况下,后边我们在框架里边呢,诶也会通过注解的方式去配置,说当前的隔离级别是什么,诶那个配置就是有效的,就类似于我们现在这样的配置。
12:04
当然一般情况下呢,你像这个你要操作是不是每次获取连接都得配置啊,所以通常建议的话呢,是我们数据库一开始默认的那个就是避免脏毒的呀,哎,对的啊,诶咱们现在这个整个数据库里边是不是还是叫独威提交了。还是那个独立提交的啊,诶那这个我怎么着就回来了呢?诶其实大家呢,只需要在这个管理里边,虽然现在你是独立提交,你把我们这个服务呢,重启一下,它其实就回来了。哎,这个咱们是MYSQ嘛,在这儿我把它重新启动。哎,重启了,哎重启以后这时候呢,我们再去,诶比如打开上面这个做一个select操作,那这时候变成四了,诶四找一下刚才这个connectionion。嗯,这是不是四,哎,这又变成叫p read了,就相当于我们做的这些操作啊,其实呢,你在这个服务重新服务器啊,MYSQ这个服务器重启以后呢,其实它就还原了,首先这不是白改了吗?所以咱们数据库服务器呢,一般情况下你不会考虑重启的,你要一重启好多配置得重新做一遍。
13:14
诶就属于这个问题了啊,诶就是不管怎么样啊,只我们写Java代码的时候呢,一定要保证咱要避免那个脏的问题,你如果说数据库本身呢,是已经避免脏的问题的,你就不用这样做了,如果你要担心它可能没有避免,我们在代码当中呢,要加上这样的语句,哎,保证它是避免脏毒的就可以了。好。
我来说两句