00:00
好,呃,咱们通过刚刚的一个操作啊,使用这个大家注意看一下,使用这个led local啊,咱们已经实现了这个事务的管理了,对吧,通过这加上这个try cash已经实现这个事务管理了,哎,基本上已经可以了,但是咱们这个事务管理。写到这里就算完成了吗?不是的,大家请看一下哈,那么咱们刚刚啊,只是以这个什么。生成订单为事例来说明了这个事务管理。大家想想,在实际的项目开发当中,其实是有很多很多的service,而且每个service都有很多很多的方法。对吧,而且每一个方法都有需要用到事物的情况,没错吧,那你怎么办?你要是不是得给每个方法都加上这个TRY开才行啊,那在哪加,咱们现在的做法是不是在注意看啊,在这个里面。
01:00
在这个里面每一个方法,你看在这个设上是不是加呀,哎,这种方法呢,大家注意啊,其实有些笨拙。因为什么?因为如果是这么做的话,我们需要给每一个你看啊,需要给每一个中每一个方法调用service某某某方法的时候都需要加上try catch是吧?这样就太笨了,你知道吗?这样就太笨了,那如果说有什么方法一次性的给所有的service上都加出来开,那是不是很爽?好,接下来我们就来看一下如何实现我们要的这个效果啊注意看接下来我们干啥呀啊注意啊,别着急。啊呃,往下。接下来咱们要干的事情就是。3.2,使用future过滤器,统一给所有的service方法都加上try catch来实现事物的管理啊,用这个那就方便多了,一次性都加上了,就不用一个个去写了,那问题是这咋做呀?我们怎么给future都加上呢?
02:28
来咱们请看一下哈,我现在呢,画图给你分析一下,咱们说future它是怎么回事,咱们举个例子啊,比如说现在现在有一个。Transaction future事物的future过滤器啊,那么它就是用来加什么呀?加我们刚刚说那个try catch的,它怎么加,它里面有个方法叫什么东西,那叫do future方法,还记得吗?
03:01
别着急啊,注意看public word读书的方法是吧?哎,它的参数就是request response,还有。Future tri不就这么个情况吗?是吧?好,再来看我怎么加,我们说这个里面它其实是分三段的,还记得吗?啊,Future。Do future,这是不是一部分?好。再看,那么它前面还有一部分呢,还记得吗?它前面有这个前置代码对吧,后面还有这个什么后置代码还记得吗?好,大家请看,我们说train点读future,就是future train啊读future这个方法它的作用是什么?啊,还记得吗?来,我们回忆一下哈,我们说future去点读future方法的作用是,一调用下一个future过滤器是吧?第二调用目标资源,还记得吗?调用目标资源,那么请问serve算不算目标资源?
04:28
啊,我们说默默资源有什么,有HTML页面是吧?呃,GP页面,那么我们说,呃,什么TP文本,还有gpt图片是吧,这些都算,甚至还有什么serve程序,为啥你GSP都算,我凭啥不算,因为你这个GP是不是就是一个S,能理解吗?好,那也就是说大家注意看看。注意看,我们开始变个魔术了哈,我们在这边调用这个train.do future的时候,其实是什么间接的调用。
05:07
程序中的业务方法,这个没有错吧。啊,没有错吧,也就是说它就会调用到我们这边。All的这个create的方法。能理解吗?也就是会调用,我们以这个订单为示例啊,比如说它就会调用到all的策略的程序中的create all的方法。没错吧,而这个方法里面又会间接调用什么东西呢?这个all的呃,应该是直接了啊,这就直接调用了哈,那么调用什么东西啊?嗯,order.create or的方法,这没错吧,好,那么注意看看哈,注意看一下,那么这么算来的话,这么算来的话,那我们能不能说注意看注意看哈,那么future理间接的调用了。
06:18
什么东西某某某就是order service.create order这个方法我们能这么重理解。这个能理解吗?你上面这个掉了它,那是不是也就等价于我这一行代码掉了这个all service能理解吗?那么如果是这样子的话。我给这段代码哈。注意看哈,我给他加try catch是不是就表示了我给他加了try catch。诶,有同学开始想明白了,是吧?啊,对了,大家看,那我这个代码就可以变成出看见了吗?然后我在这个地方catch,诶这是不是感觉很精彩对吧?来这里面有异常,然后呢,注意看我在这里面干什么事情,提交数,而在下面呢,回滚数,那么你想想啊,如果这个代码按照这样一个方式去变化的话,那么我是不是就使用这个future给所有的注意啊,给所有的。
07:30
Future service方法都加上了。能理解吗?咱们说一下哈,按照上面的分析释义,那么就。可以使用一个future。啊,一次性统一的给什么所有的某某service的所有的某某某方法。
08:00
都统一加上try catch啊try catch来实现事物的管理,那这就简单多了,大家能理解吗?我就不用一个个去写了,对吧,咱们程序员这种这种能力还是要有的。这个能力还是要有的,那这个时候我们来看一下怎么做,我们如何来写这个future啊,大家看一下哈。呃,我们在future里面呢,这个包下再建一个类,叫做transaction future trans,事物的意思,看事物的过滤器,呃,然后让它实现future接口,别导错包Java X的好。实现这个方法,我们说我们关心的方法是哪一个呀?读future吧,你看我都给你分析了嘛,就是这个读future里面嘛,那我把它画上来一点点哈,画上来一点好一点啊。
09:07
Okay。好,就放这样吧,就放这样吧,哈,好。那么按照这个做法的话,我们是不是在里面写上一个TRY,这个TRYTRY谁future。看到了吗?这个呃,Future trend点读future吧,那么我们在里面加上future trend点读future。好,那么对它进行try catch啊,注意看我try catch。好,那么我把它变成一个异常就行了。我们不需要写那么多个啊,不管你是啥异常,我都给你补货了,好大家想想啊,我们在这下面需要干啥?下面是不是提交事物,所以我们我们在这边写上什么GDBC you.com and close提交数,而我们在出了异常的时候,GDBC u.low back数看到看到了吧,这什么回滚数回滚数,好大家注意这个类写好之后你要让它生效怎么办?你是不是还得到web点擦描中去配置。
10:24
好,我们来看一下如何配置啊。呃,在这里啊,走它,那这个怎么配置呢,我们。复制一份。哎。好,诶,这东西怎么下来了。好大,大家请看啊。这个地方写成transaction。Future把这个类也改一下啊,然后在下面future mapping是trans future啊,大家看到这个地址就很很很庞大是吧,我给他来杠新。
11:12
当表示什么呀?啊,表示当前工程下所有请求,大家想想,我都已经包含了所有请求,那么是不是就表示我对所有的业务都进行了try catch能理解吗?哎,那以后呢,不管你写什么地址,你做什么业务,哪个模块,我通通都给你加上这个什么税务管理。哎,那这个时候我们还需要在这里面加吗?不用S就不需要再写了啊,这个代码就把它删掉了,看见了吗?整个代码变化很大,我们不需要再跑到什么里面一个一个给别人加事务管理了,不需要了一次性统一的加。好,那现在我们就使用这个future,我们来看看他能不能有效的管理事啊,我们就来看一下哈,呃,同样我们还是在这里打上这个错误哈,我们先看看数据库,数据库这个还是没有的哈,好,那现在。
12:17
停了。停了哈,我们用debug启动,我们就看看这个小的细节。我们去看这小细节啊。我在这里面也打上这个。断点。稍等啊,我们也都打上这个断点,走走走。好,但是现在大家看啊,这个断点咱们现在还不需要用,所以我先把这个画上,画上的话这个断点暂时就失效啊来,我先加点东西,我现在不需要断点,呃,我先登录。呃的命,呃的桃,我登录成功啦是吧?我回到购物车,我准备要结账了,这时我是不是需要断点啦,我在这边,我恢复这个断点,走,这断点统一都生效了,看见了吗?
13:06
哎,都都生效了哈,这里也都有了,然后请注意看,我点击结账的时候,我看这内容走,他是不是先进入到future,我点到结账以后先进入future,看见了吗?然后我说这一行代码是干嘛,我说这一行代码它间接的调用了这个生成订单的这个事是吧?好,我在all的S里面,我给你这个地方打个断点了,看见了吗?我们看它会不会过来啊,注意看啊,我点这个走。它是不是过来了,跟我们预期的一样啊,诶好别着急,别着急,再往下走哈,再往里面走走走走走,注意看订单已经保存,但是它生效了吗?依然没有生效,因为它没有提交,紧跟着注意。这个地方会出异常。注意看哦,这个异常他会来到咱们这里吗?
14:06
我先告诉你不会,为什么不会呢?我一会再告诉你原因了,来,你先看看,咱们还是要改个东西,注意看啊,我现在先放过去,这是不是出了异常,你看到了吗?很奇怪的,他居然要提交数了,看见吗?哎,为啥呀?为啥?你看这边我们我们看这个SL里面,大家想想这个异常是不是已经抛出了,是不是已经抛出了,从哪抛的。先是从这个O的service里面抛,然后抛到最终又抛到了哪里,拦截到了。Base,看见了吗?看见了吗?这个地方是不是调用业务方法,咱们在这里是不是已经捕获了一次异常,我们在讲事物的时候讲过,你任何的这里面产生异常都不能吃掉,你是不是一定要把那个异常抛到外面才行,而我们现在呢,在贝斯select看见了吗?
15:01
在贝斯已经捕获了异常,那么我们的这个future大家注意就收不到异常了。那怎么办?那我们先说一下哈,你在这里捕获到异常,一定往外抛,否则的话,外面这个事物管理它还是会失败,所以继续抛,哎,把力想往外抛,这样就行了,抛给谁呀?咱们说把异常哎抛给future过滤器,因为这个base已经是什么,大家想想哈,这个base已经是在这里面了,你这里都已经把异常消化了,这里是收不到异常的,能理解吗?你要从这里把异常抛给他,哎,所以注意看我们在被测受的异常往回抛,最后再试一次啊。我们看看这边啊,给它删掉啊,给它删掉。好,再来试一次哈。呃,同样咱们现在还是不需要这个断点,让它取消,先先回来刷新一下,我重新重新这个debug启动一下,刚刚把它关了啊。
16:09
稍等哈,咱们激动人心的时刻就要到了,咱们这个future行不行,就看这一次了,是吧,啊来。OK,我加点东西啊,呃,这里面已经有了,我去登录,我命我命好,这个时候我准备提交,我需要这个断点了,我把断点它恢复。都回复了哈。我点这个结账。大家请看,它再一次进入到呃,Trans future,我可以把其他都关了啊,啊,其他都关了,然后这时候注意看啊,我执行这行代码,它会进入什么select里面走select不进来了,然后这里面就就跟我们说的一样嘛,我们说training to future它调用的方法,呃,这里呢,又直接的调用了什么?呃,这个service的方法。
17:00
来看是不是啊,对吧,然后我们进去啊,进去之后走走走走保存这个订单,然后。呃,出异常,出异常以后他先抛到哪,抛到贝之类的,走啊走。A。怎么又来到这里了哦,我们背着没有打断点,但是大家注意看啊,虽然没有打断点,但是它是不是已经进入到trans future里面来了,不像刚刚是不是来到这里啊,好,这个地方怎么办呢?回滚数走,注意看啊,走得到连接判断一下,如果不等于空回滚竖关的连接走,这时候我们到数据库中看一下。所有的操作是不是依然全部都失效啊,看见了吗?哎,那这种做法呢,我们就使用了future过滤器,统一的给所有的算法都一次性的加上了什么。Try try future try,呃,对,TRY啊,就加上个show OK啊,这种方式呢,就简单很多了啊。
我来说两句