00:00
下面呢,我们来说这个spring的事务管理。这个的话呢,是我们开发的时候必用的一个功能,呃,我们首先来看一下这个事物,这个事物呢,我们讲阶梯必心的时候就说过,什么叫事物啊,事物是一系列的动作是吧,他们被当做一个独立的工作单元,要么这些动作都完成,要么都不完成。举一个例子,比方说转账,A给B转500块钱,这个时候需要有两个操作,A的账户减500 B的账户加500,两个操作吧,好了,要么都完成,要么都不完成,如果只完成一部分的话,这个数据是不是就被破坏了,那500块钱怎么了?要么就是没了,要么就是凭空多了500。
01:05
这就是事物,人家问你什么是事物的时候,你就可以这样回答,当你说概念说不清楚的时候,你就说,哎,那我给你举个例子吧。那你你好举,哎,他也便于理解事物的四个属性,原始性,一致性,隔离性,持久性,我们不再一个一个说了,那我们看一下我们在讲JDBC的时候如何处理事物的,在目标方法应该是业务方法开始之前获取链接,开启事务,如果执行这个目标方法没有任何问题的话,提交事,关闭链接,如果要是出异常的回滚事务,关闭链接应该是这样这样写的话呢,这就导致着我们任何一个业务方法。都需要啊,在这样的一个模式的一个这个代码里边去写,就是说任何业务方法呀,都写在这。
02:08
这样很明显是有问题的,就是当我们呃去做一件事,发现里边有很多重复的时候,就要想,哦对,里边获取会有解决方案,那我们要是从这块看的话,大家看我这个获取链接跟开启事物是不是相当于那个前置通知啊,是吧,提交数相当于什么返回通知吧,而回滚事务呢,相当于是异常通知吧,那finally哎,这相当于是一个后置通知。这就是我们使用spring a op去处理事物的一个基本的原理和出发点。好吧,那我们用去做事物的话呢,有两种方式,一种是支持编程式的,说白了就是你没写代码,还有一种是支持声明式的,通过配置就可以了,我们使用基于声明式的事物管理,就一配置就可以,而我们那个代码还是像以前那样写。
03:17
是不从不同的事务管理API里边抽象了一整套事务管理机制,开发者不必去了解事务底层的API,我们就可以去处理事物,换句话说啊,我处理处理JPA处理买杯体处理方式是一致的,我们今天把如何用spring去管哈的事物学会的话,嗯,我们就知道哦,我处理JDBC也是这样,我处理JP也是这样,我处理买杯T司也是这样。当然了,我们这里边讲的话呢,是讲这个,嗯,JDBC的,因为我们还没有去集成harmpla,但是接DBCD个讲完之后,呃,回头我们再讲harmless的话,你会发现我处理harmless的这个生命的事物跟管接DBC是一样的。
04:08
非常的简单,大家看这里边有一个核心的一个抽象类,它就什么呀,Platform transaction manager是吧,叫事物管理器好了,对于JDBC而言,有一个data source transaction manager,对于harme有一个harme transa manager,而对于这个GTA的话呢,有一个ta transa manager。好吧,我们直接看需求,直接通过例子来进行说明,我们有这样的一个需求,嗯,我有一个接口叫bookstore Bao,这里边的话呢,有三个方法,根据书号得到书的单价,叫sand book price by asbn,然后呢,根据书号去更新书的库存,还有一个就是根据用户名和账号去更新用户的余额,还有一个实现类,这个实现类的话呢,是用阶DBC来完成的。
05:18
然后我们在它的上一层有一个service,这个service是买书啊,一个用户名,一个书号,那个意思就是一个用户一次只能买一本书,这个时候需要完成两个操作,第一个书的库存减一,第二个账户余额减去负的单价,听懂了吧?那我们那个事物的话呢,就需要加到这个上边,这就是我们这个需求,我们先把这个整个搭起来,首先呢,这里边儿需要一张数据表,这个数据表我已经写好了,我们把。
06:00
嗯,这个麦麦色给打开,那就再连一下呗,我找到不是这个不是这个是我们看一下book。书有这样的两本,一个是Java,一个是Oracle,那书号呢,1001002,单价是100跟70,嗯,账户AA怎么就没有ID哈,160,嗯,我们这个的话呢,我们回头我们会联示的话,我们可以改它,还有一个书的库存啊,1001是四本,1002是八本,就是说这三个简单的数据表对我们演示这个事物的话是够用的,现在的话呢,我们就来写这个DAO,那我整个这个操作呢,就建立在我们上节课讲JDBC这个基础上了,因为我们这里边同样需要数据源,同样是需要GDPCT,所以这面直接用搞一个什么呀,叫transa manager置5TX。
07:29
新建一个接口叫不凤凰do。Interface,第一个public in the book price is,根据书号获取数的单价,第二个这更新书的库存,Talk isn,根据更新书的库存,那我这块我是不是只传了一个书号啊?言外之意就是使它所对应的库存减一是括号对应的库存。
08:44
好了,Update strange build the name,再有一个in price。
09:11
更新用户的账户余额怎么更新啊?使user name的balance减去price吧,我一次只买一本书就写完了,现在的话呢,我们给它写一个实现类book so。DA,好,实现的话你靠什么呀?你private,我们先讲基于注解的at,然后这个名字呢,In就不要了,CTRC,第一个字母小写。
10:18
这个需要自动的录入进来,第一个的等于select。Price from book while ISBN等于问号,看一眼是不是这样哈,Bookb没问题,Returnbc template.for objects,第一个方法差一点,它得加参数是吧?你是加参数的爸爸。
11:02
Circle口,嗯,点class后边的参数S行了,第二个等于update。等于减一,这ISBN等于问号,看一眼哈,不stop问题,然后更新接C temp.update个circle口就可以了啊,还得有一个参数搞定。最后一个更新账户等于update a s balance等于balance减去问号贝,You name等于问号,看一眼对不对?哈,Account,哦,You name balance,这没问题,Account,然后呢,JBC的点update circle参数第一个是price,第二个是user name写完写完之后应该怎么加?
12:45
应该测试一下吧,写对不对啊,那我首先呢,到这个里边来,我这个扫描这个包,你看我以前扫描的是谁呀,是不是叫JDBC啊,我把这个去掉,那我这样一写的话,他就将扫描spring这个包以及子包,你看这个S是不是加上来,这个时候我就可以来做测试了,Unit。
13:16
Spring transaction application context,然后book放doo。说实话,DTX等于new plus plusl application contact这个。Book so DAO等于c.x.get b book soft do.class这是第一个方法,Book soft do find price I isn out da.find price会有一个1001好找一个,应该返回一个。
14:35
出错了吧,出什么错啊,哦,我四里边没有这个是吧,这个包需要改一下,我这个是在这个包里边,在spring这个包里边,这个去掉再来百没问题,第一个方法这样测试就通过了,第二个方法,Book so DAO update,更新,更新书的库存。
15:25
Books do.update1001是1001这个数的库存减一,看一眼哈四跑一下。没有错,减一,OK,这也过了,再看一个更新用户的余额,Update you空at book da.update来,我这个人叫。
16:20
啊,钱呢,我写一个一百一个。过了没问题,再看一眼,这是OK的,这样的话呢,这三个方法就写完了,我们过来看一眼来,这是不就是我们在这个上节课学的GP,没有什么说的,但这里边的话呢,有一个细节我们需要说一下,这个是建表的circle,你直接拷过来,直接就可以复制,我们看一下哈,关于这个书的库存以及呃账户,我们是加了检查约束的,但对于买色Q而言呢,装加,呃,你可以加,但是不好用,什么意思呢?就是说这个时候我使这个钱数,以这个为例吧,我使这个钱数减100,我现在我是不就就剩60块钱了,照理说应该不能减了吧,他还能减。
17:29
你看你没有异常也过了,而且真的成了负40,这个是我们不能够忍受,也因为这样的话我就试不出效果来了,所以说我们需要手工的,嗯,去把这个异常抛出来,抛什么异常啊,抛那个检查约束异常,因为买soql不支持,所以说这里边的话呢,我们来写一下手工抛啊,第一个说需要什么检查账户说出的库存是否不够,够不够,不够则凹出长好,那我来写一个吧,String circle two等于select。
18:29
Talk from。哦,Y is BN等于问号,那我们这个要求是这样的,我这回一次就不买一本书啊,只要这个值大于零是不是就可以啊,等于零就不行了吧,我一次只买一本书,所以说我就把这个结果搞到因此。等于c.query for object这个方法circle,我需要引开点class BN,好了,如果stock等于零的话,那不够了吧?这个时候我要抛出一个异常,我要抛出一个异常,那我来定义一个异常吧。
19:30
这个的话,我们大家说我定义这个异常的话,这个异常怎么定义通常啊,继承谁对run time exception,然后去搞搞构造器就可以了吧,去搞构造器。嗯,全放着吧,都无所谓好了,我们用的是不是就是这个异常的名字啊,对吧,就是根据这个名字我就知道出了什么问题,再定义一个。
20:11
You a accountion按time exception扩照器全部加上一个自由个百度ID回来。嗯,在这好了,这个时候的话呢,我就抛一个异常数据new exception说库存补助。库存好的,这个呢,也需要使用类似的方式去验证一下CTRLCV,这是验证余额是否。
21:09
不够肉,不足折包珠肠好了,这就select is from well you name等于什么?这块写成you name就可以了,然我怎么写?如果这个值,这应该是balance吧,Balance如果balance小于得price钱不够吗的一常是exception告诉一声叫余额不足好搞定,这两个我们需要来测试一下,首先呢,测试一下这个余额不足100块钱,回到我们的这个测试里边来啊,200,这个时候我们看的效果应该是个什么效果呀,抛出异常余额不变吧,看看那余额不足看没问题,这个里边看它改成一个零,刷新我们再。
22:38
试一下这个001抛出库存不足,然后的话呢,那个库存还是零,过来看库存不足,这个库存的话呢,也还是零,OK,这样的话呢,我们底层这个DAO就写来了,那这个DAO的写法的话呢,主要是用这个JD bc timelesst,然后因为买circle不支持检查约束,所以说呀,我们自己进行了一个验证啊,好的,继续这个完之后的话呢,我们再往上看,我还有一个bookof service,买书传一个什么呀,传一个书号,再传一个嗯,用户名,然后我要做两个操作,第一个库存减一,第二个呃,更新账户好了,写一个这个接口看一眼啊。
23:38
这叫。User nameme啊,这个人买了一本书,书的编号是S好的,搞一个实心类接口上去at service好了,我需要用到什么呀,不吧,加进来艾好的,这里边的话呢,进行操作,第一个什么操作呀,获取书的单价,第二个呢。
24:42
更新书的户主,第三个更新用户余额吧。哎,进行这样的一个操作,那我们来看一下吧,第一个叫books do.find s点得到一个price。
25:11
更新出的库存,更新用户的余额就完了。写完了,写完之后的话呢,再测试。哎,这个有意思了啊,真正到这个设置代码这块了,来public his service真正到测试这块了,于是我们想的好用来十本。纸本啊看哈啊,100块钱,这书呢,就是100,我暂时把这个我先给它改为啊一百一百六来试一下吧,首先我搞一个private so等于。
26:23
Service等于cx.b service点来操作了啊,Books service.course买呀E。买10011把能买成功吧,钱也够,库存也够,看看好不好使啊,哎,正常瞧着60这个九本吧,好了,我第二次买的钱不够了吧,钱不够了吧,钱不够的话呢,然后靠我们这个操作来,钱不够的话,我这个操作是我是不是先更新的库存呢?这个没有异常吧,这没有异常吧,这个有异常吧,没加事物吧,所以说这个结果是啥样的,库存减了,钱没减吧,好看一下来九本60好再找一个。
27:43
啊,余额不足,想到一样的60 OK 900是不是减了100啊,这不是事物了吧,我们就要让它试十物怎么办?这就是润要帮我们干的事,OK,我们可以说前面这么多的话呢,都是一些,呃,准备工作,下边的话呢,要真正开始精彩的地方,开始之前把这代码发给大家,大家先看一下,没问题的话接着讲。
我来说两句