00:00
好,来我们继续啊,那么刚才来呢,我们已经通过这样的一个案例,把这个事物的这个问题呢,给大家已经演示出来了啊,然后接下来呢,我们就来去解决这个问题,怎么解决呢?那就是使用我们的一个声明式事务啊,然后呢,呃,首先我们要去使用它这个声明式事务的话,我们得有一个事务管理器啊,这个事务管理器呢,我们刚刚也说过了,因为我们用的是JDBC的事物,所以说呢,我们就使用一个data source成像是manager啊,用的这样的一个事物管理器,首先我们需要把它配置到我们的LC容器中,再然后的话呢,因为我们要基于注解来去开发,所以说呢,我们要去启用一个事物注解,好来,接下来我们把这两件事做一下,首先回到我们的事物的这个配置文件中啊,然后呢,在这个配置文件里面呢,我们在下面,嗯,好在下面呢,给大家去配置什么呀,事物管理器,那么这个事物管理器呢,我们刚刚呢,也提到过了,它叫做好叫做什么呀。
01:01
Date source是manager吧,来date source3是manager好就是它,然后呢,呃,这个里面我们再给他一个ID啊,这个ID的话呢,比如说我还是习惯性的就使用你的方法的二首略啊类的这个名字了,我们把这个D的改成小写的。啊,这是我们的一个事物管理器,但是啊,大家一定要注意,如果说你想去管住这个事物,那么你最起码呢,你得管住一个东西,什么东西啊,大家想想你是不是得管住连接啊。对不对啊,你要求管不住连接,你俩都管不住事物啊,所以说呢,我们就需要什么,把我们现在所使用的这个数据源,因为我们的j dbc complete,它用的是就是这个数据源啊,所以说呢,我就必须要把这个数据源呢,诶让我这个数管理器诶进行一个管理,所以说你看在这里面我们直接使用一个prompting,它里面就有一个data sourcece的属性,我们把再把自己的data source给它注入进去,听懂了吧,来,所以说这个位置它是不能少的,你少了它,你的事务是管不住的,理解吧,OK,好,这是我们的事务管理器,下一步的话,我们需要什么呀,开启事务注解啊,因为我们现在是基于注解的方式来去开发的,因此这里面我们需要导入一个新的命名空间,叫做TX啊,TX就是我们的事物啊,然后呢,这里面的话呢,我们就写个TX,有个lo drag啊,加上这样的一个配置,那么这个配置里面呢,我们有一个叫做T。
02:39
Session manager啊,这个属性需要给大家去说一下,呃,它是用来去指定一个事务管理器的,然后呢,你看我提示出来以后呢,它的名字就叫做trans manager,也就意味着如果说我们自己配的这个事务管理器,它的这个ID值如果是叫trans manager,那么这个东西我们是不需要进行配置的,也不需要把它写出来,假如说你的事务管理器的名字并不叫做trans manager,比如说像我们的叫什么呀trans manager,那么我们就一定要把这个给它指定到这个位置。
03:16
能听懂了吧?啊说说呢,你看了哈,我们就把它拿过来指定到这就行了,理解什么意思了吗?啊稍微解释一下啊啊请3MANAGER啊,就是用来指定事物管理器啊如果啊,事务管理器的这个名字啊,就是这个ID值啊ID值是什么呀?是这个叫做全manager啊小写的是吧?啊如果就是它的话呢,诶,那我们就可以什么可以省略啊,不进行指定啊可以。好,可可以省略,不进行什么呀指定啊,这个能明白了吗?没问题了吧?哎,我们就可以把它省略掉了啊,就不用再去进行指定了,好,那么我们把这两块加上以后呢,我们的生音之数就可以去使用了,来接下来我们就回到我们刚刚出问题的这个位置,就在service里面的这个方法上面,我们刚才分析出来了,我是不是希望把这个三个操作放到同一个事物中吧,对吧,怎么放到同一个事物中呢?诶,我们就直接在方法上面加上一个注解,叫做三注解,这个事就搞定了。
04:40
啊,就是一个注解往这一标,这事就完了,明白了吗?啊,很神奇是吧?啊赶紧想想怎么做的呀,对不对?来吧,我们先看这个效果吧,呃,再回到我们这个测试类里面啊,找到我们这个测试类,大家来注意,呃,我们先来看一下数据库里面,数据库里面呢,现在我把这个库存呢,还是都改成这个十本,能看明白吧,都改成十本啊,然后这个用户的余额呢,我们改成个150块钱。
05:12
改成150块钱啊,把数据表诶改成150块钱,看到了吧,呃,库存表呢,都是十本,然后呢,余额是150块钱,然后呢,现在我们再回到这句方测试,我去买上一个幺零零幺一百五,买100块钱的数能买吗?可以吧,来运行一下,那么第一次它是正常的,就是我们得确保你加上那个事物以后,我正常效果是没问题的啊,所以说你看运行正常,然后呢,我们来到这刷新一下,还剩50块钱啊,这个库存表里面是不是少了一本,好,接下来这50块钱你买谁你都买不起,比方说我还是去买我的1001,我们来运行刚才的效果是什么呀?是不是钱没减,库程减了吧,但现在我们已经加上了事物了,所以说我们再去对写的话,大家注意。首先告诉你余额不足,然后呢,看数据库里面的数据,我们能看到的是什么呀?来刷新还是不是900啊,是不是还是900少没少没少,库存这个余额表呢,还是50块钱少没少没少,这个事就搞定了,明白了吧,生气吗?好,那么我们来给大家解析一下这个家伙到底是怎么做的啊,其实你加上这个注解啊,那么将来point呢,他再去扫描到我们这个类的时候,那么他自然而然是不是也能扫描到这个注解啊,对不对,OK,他看到这个注解以后,也就相当于我就知道了,这个方法是要被事物所作用的。
06:41
对吧,就将来要纵容这个事务的,而我们的事务是谁去管的呢?是我们的那个事务管理器来去管的,所以说呢,他就相当于要动态的把那个事务管理器的一个功能呢,给它纵容上来,那么这个过程大家想一想,我是不是就得给你当前的这个类生成一个代理了吧,对吧?啊,那么我们能把这个分析明白,接下来我就来测试,你看我现在拿到了这个booksh输出一下,好输出谁呀,Bookshop加改成加改成。
07:19
好,大家来看,我再来运行一次啊运行OK,大家注意什么东西大家对吧?OK,那么既然你是一个代理,那么其实我就能明白了,他就是给我返回一个代理对象,然后呢,将来的话呢,他就在我这个方法上面呢,给我加上什么了,事务管理的代码是不是就可以了,嗯,明白了吗?OK,那假如说你看我把它去掉以后,去掉以后也就代表了这个是没有事物的,然后呢,我们再去演示的话,首先我们能看到的就是它获取到的就是我们最原本的这个对象不是代理了吧,而且呢,数据库里面呢,你看一看是不是又减少了一半啊,对吧?啊所以说呢,就是因为我们加上中介以后,他就相当于给你要生成代理,然后呢,再通过我们的什么呀,A op的方式呢,把我们的什么呀,事务管理给你要作用到这个方法上面。
08:13
听明白这个意思了吧?啊,所以说呢,你看为什么我们之前要花费那么长的时间去讲这个LOPP,去讲这个动态代理呢?原因就是这个位置他要用,对吧?你想一下,如果前面我不讲这些东西,我直接来到这给你去说它,你能听得懂吗?你肯定理解不了,对吧?但是现在我们有了前面的这个铺垫以后,再来理解它,那就其实特别好理解了。听懂了吧,OK,好,那么接下来呢,我们用到的这个trans啊,我还是要给大家去解释一下这个trans,它这个注解可以啊,标注的一个位置,它既可以标到我们的方法上,其实也可以标到我们的肋上,这个是在哪体现的呢?我们来到这个注解里面来瞅一瞅啊,它需要加入一个TX的包,那我就给你加上一个,好找到我们的TX的包,TX在这加进去,加进来以后呢,我们就能看到在这个注解里面,注意它就是一个注解吧,然后呢,注解上面有一个target这个注解,而target代表的就是你能所标注的位置,你看有一个method,有一个tap method代表的是方法,Tap代表的是累,所以说这个位置我们就可以怎么着了,直接把这个trans也可以啊,标到类上面明白吧,那么你标到类上面以及标到这个方法上面有什么区别。
09:37
也没有啊,整个类的来听我讲,如果你标到类上面,那么它就是什么呀,哎,对所有的,就是对当前类中所有的方法都起作用,那么如果你指标到方法上呢,它就是什么前只对当前的方法起作用,明白了吧,OK,那这个时候可能有同学想了,哦,那我就知道了,我将来我直接标到列上就行了。
10:08
省得我在每个方法上面都去标它是吧,可不可以啊,可以的吧,啊,我可以这么去做的,但是大家注意,既然人家能这么来帮你去实现,就是方法上也可以标,那么我们就得想到一种情况,就是有些时候我在使用事物的时候,可能我需要额外的去指定一些事物相关的属性,这个时候内上与方法上我们就不能很统一了,大部分的就是比如说大部分的方法你都可以基于类上面的来去解决,但是呢,个别的一些方法我们可能需要做一些特殊的指令,那么我们就必须要在方法上面去给他重新去指定了。理解了吗?OK,所以说呢,还是要告诉大家就是什么呀,如果你标到类上,那么对所有的方法都起作用,如果只标到方法上,只对当前的方法起作用,假如说类上也有,方法上也有,那么方法上面的有先,听懂了吗?方法上面的有先啊,好,这是我们的乘30这个注解,它可以标注的一个位置,OK,这也是我们对破生理式事务管理最基本的一个用法啊,就给大家说这么多啊。
11:20
嗯。
我来说两句