00:02
哎,嗯。来,咱们来先看看这个具体的操作的步骤。操作啊,也可以认为是,其实就是代码。就写代码吧。呃,这里边儿首先呢,我们先去。呃。对,先去配置一下我们的事务管理器。啊,第一步配置事务管理器,第二步呢配置A,第三步呢,我们去配置一下这个事物属性。嗯,就是这么几步啊。这个配置事务管理器。对这个,哦对了,这里边儿呢,我们。打算哈。再放到另外一个配置文件里边,当然说这个配到一个里边肯定也行,它运行没有啥问题,我们就是希望每个配置文件不要太长。
01:07
不要太长,而且呢,每个配置文件专门就是完成一个任务的。那么我们说开发里边呢,我们模块划分的时候吧,有一个原则叫做单一职责这个原则。单一职责,哎,就是说呢,每一个模块也好啊,每一个类也好,配置文件也好,最好他干的事呢,就是只干一件事。啊,或者说同一类的啊,他负责的事儿越多啊,他越多越杂,他这个就越乱套啊,他就呃越容易出错,越不容易维护啊,所以说呢,我们这边咱们生命是事物呢,咱们另外去建一个配置文件。前边呢,跟他一样。哎,咱们后边叫。TX。哎,这边TX代表事物啊,那么这边我们需要用到的名称空间呢。
02:02
哎。Contact好像啊,Contact是需要的,我们需要配那个自动扫描的包,对对,说起来这个的话,这个service哈,Service这它是通过自动扫描的包,它加入到LC容器的。这个这个咱就那不写了哈,咱们配上就好了。嗯。Context是需要的,然后呢,TX是需要的,Up是需要的。嗯,画个圈。嗯,这儿。还有这儿。所以这个吧,在这个前边这一步呢,是我们去创建。专门管理。
03:00
事物的配置文件。然后呢,去加入我们的这个名称空间。对这个文件呢,我们也标记一下。哎,让大家看到是属于哪一个工程,属于哪一个文件。诶,创建这个配置文件,然后呢,去呃添加名称空间。哎,然后呢,下边我们去配这个,对,咱们在这前面去配置一下自动扫描的包。回到它源码的部分。配置自动扫描的包。
04:01
这个的这个时候呀,在这里边儿主要是。是为了把。我们业务逻辑层这个service来扫描到LC容器中。主要是为了这个。Component。这个base package啊,我们扫描的话呢。这是我们map接口,那如果service的话呢,我们就是把map改成service。然后service呢,它又分这个接口和实现类啊,我们,呃,接口呢就放在API这个包里边,实现类呢就放在这个包里边。创建service的包。
05:07
嗯,然后我们要扫描的就是它CTRLC。那么其实呢,就是。这俩是他的子包啊,就在这儿,你刷新一下的话呢,那个这个就没有了是吧,就只就只是他俩了啊,这个无所谓啊。哎,然后呢,这边下一步我们可以去配置一下事物管理器,哦,对了,这个配置拿到笔记。配置事务管理器。这个是一个来个B,来个ID,来个class。来一个data source trans c manager。然后呢?这个给他来个ID。
06:03
咱们跟我们画图这儿一致吧。一致吧,这个。叫TX,对,TX manager。然后这里边儿呢,需要装配一下数据源。那这个数据员呢,不在这个配置文件里边,他在另外一个配置文件里边。那么这时候其实也还是直接写。你这是这个ID是啥,这儿就是直接写,写完了呢,这会有个警告。哎,这会有个警告,他告诉你说。呃,这个东西呢。啊,就是反正他的意思吧,就是说这个应该是说根据这个他现在他觉得找不到,但是呢,我们实际运行的时候,只要你这两个配置文件都加载了,哎,它从LC容器里边是能够找到的。啊,所以这个时候,现在他有个警告的话,这个不影响。
07:01
这是给他装配数据。好,这是事务管理器就有了,下一步呢,我们去配置我们的这个A。或者叫做事物的切面。A p config。Up的。A point cut。Expression。来这来一个XQ。嗯,在这里边去配切入点表达式。嗯,我记这个切入点表达式,这个格式呢,我是这么记的哈,我先不考虑那些什么星呀什么的点什么的,我先不写任何通被符,写一个完整的,比如说呢,Public。Com点艾特硅谷点。点点。In service.savein哈。里边传个类型的。
08:00
然后这边ID一会儿再说。那这个时候呢,我们说现在它定位到的是一个具体的方法。这个具体的方法我们呃,在这个基础上啊,去改一下就好了,Public和string哈,权限修饰符和返回值这个部分可以用一个星号来代替。然后呢,这个包名呢,可以用星号表示是任意包名。可是包名呢?包还有很多层次,那么这个时候呢,这两个点表示包的层次深度是任意的。然后呢,这个接口或者是类呢,它以service结尾就行。以service结尾就行,然后这个方法名任意呢也是写一个星。哎,然后呢,这个参数。参数写两个点。哎,表示是这个。呃,对,任意的这个参数。
09:02
哎,这就是我们把一个具体的啊一个表达式改成了一个带有通用性的一个表达式。这个时候吧,这我们后边哈,我们用spring security的时候呢,找了spring security哈,他在这会spring security有一个东西叫做user detail。Service。Spring security有一个东西是它。那spring security有个东西,它呢,它也符合这个表达式。但是这个东西呢,其实跟生物式事物也又没有什么关系,我们要是把它扫描到LC中,就是这个加入到事物里边呢,最后会抛异常。所以说吧,我们这儿考虑到考虑到后边这个security这个事呢。到最后这儿还是得改一下。得改成这个port的,就这边咱们不能去定位这个service。啊,咱们就是按我们service的这个时间类呢去定位。
10:02
啊,如果没有security那事儿的话,就你后边不加这个也行啊,我们在这儿去说明一下。嗯,考虑到后面我们整合spring security。嗯,避免。把。嗯,有一个东西叫user detail。Service。扫描到。啊,就是说加入事物。控制。我们去。杠切入点表达式。呃,定位到。这个service。那这个时候其实我们就是找的就是这个类了,就不是那个接口的。这就这么,咱们开始就索性就把它就就这么写了。嗯,反正这不写到,到后边我们用spring的时候,这还回来还得改啊,回来还得改。
11:00
然后给他一个ID。这个ad呢,叫。嗯。叫个TX的point。这是切入点表达式。下边呢,这个是说将切入点表达式和这个事物。通知关联起来。这个叫adviseor。这引用事物的通知,这引用的是切入点表达式,那么这呢就就直接去引用它就好,那么这这个呢,我们得下边先写上。配置事务的通知。TX advice。先给他的ID,这个IDTX的Y。哎,这不,这边这边就他就不报错了。
12:01
哎,保存它就不保存了。那么在这儿呢,我们这边呢,还需要去引用一下事务管理器。这个transaction manager,它的属性的默认值就是这个transaction manager,所以你这这个ID如果就是它的话,可以省略这个属性,这个属性不用配,现在我们不一致,就得明确的去写一下。下一步呢,这里边儿去配置。事物的属性。At tribute。And fis。哎。那么这个事物属性的配置呢,我们分两部分来说,一部分是查询的方法。哎,我们就配置一个,配置一个只读属性。哎,配置有啥好处呢,让数据库。知道。知道哦,原来呀,这是一个,嗯,查询。
13:01
操作,哎,嗯。能够进行呃,一定的这个优化啊。那他就不需要,像如果你要是增加改的啊,他有些有些这种优化的操作他不能做啊,设置为只读它这个查询的操作,它能够去优化一下啊,性能会好一些。那么这个TX。嗯,Method啊。那哪些方法是查询的哈,比如说get什么什么。Only设置为true。诶。然后呢,这个来一个。呃,比如说你可能会有find呀。啊,或者说你有这个。Cory。啊,或者说你是计数的count。那么说这个会不会写select呢?这个咱们就不建议这么写了啊,因为这些呢,我们跟数据库直接操作的,像map里边叫select什么什么insert什么什么delete什么什么。
14:09
啊,那么为了更好的相区分,我们service层呢,业务逻辑层select呢,就写什么get呀,Query呀,哎,然后insert呢,写这个save呀,哎,Delete写这个remove呀。我们如果有这样的一个约定的话,哎,一看这个方法名就知道它是service的啊,就我们调试的时候呢,也会给自己带来一些个方便啊。这只是一个命名上面的一个建议啊,或者说规范。这是查询的,查询就设置这一个,下边呢,这个增删改的。哎,就是这些可以说是读方法,这个是写方法啊。嗯,那么增长改呢,我们需要去配置一下。事物的传播行为。和这个回滚的异常。啊,就别的话,如果没有特殊需要,咱们可以就保持默认值了。
15:04
比如说呢,咱们来一个C星。哎,这边来一个嗯,Pro。这是我们事物的传播行为。哎。嗯。就是这个属性的这个属性啊,咱们就大家对两个值有印象就行,一个是默认值,一个是我们想采用的值。这个属性的这个默认值哈。这么样吧,咱们。哎,这个是默认值。他表示,当前方法必须工作在事务中。啊,必须工作在事物里边。如果没有。什么地方没有呢?其实是当前,它在当前县城上啊,如果当前县城上没有已经开启的事务。
16:10
自己开新书。呃,如果。已经。有了。哎,那么就。那么就使用这个已有的事物。但是我们不用它,因为呢,如果已经有事物了,它就凑合,在现在这个事物里边凑合,凑合就完事了。他这一凑合呢。那就会受到别人的影响。别人一回滚,他自己没有报错,别人一回滚,他跟着也回滚了。啊,就如同你坐船一样。你如果和别人坐同一条船。比如说你跟我坐同一条船,我把船凿沉了,你跟我一起掉水里了。这就是我们同一条船,就好比同一个事物。
17:02
但是呢,如果我们不坐同一条船,你坐你的船,我坐我的船啊,我我自己把我自己的船凿沉了啊,你你在旁边就可以拍手欢呼叫好是吧?哎,你看我掉水里,你不会受到影响啊。所以说呢,在这儿我们要用的这个呢,叫做require new,诶。这个就非常的挑剔啊,这是我们建议使用的值。他表示,前面是一样的。必须工作在事务里边。如果当前县城上面没有开的事物,则自己新开的事物就算是已经。有了也。嗯。也在自己。开启。的事物中。运行。啊,所以所以说其实这个可以咱们说的更简单一点,不管当前线程上面有没有这个事物,我们都在自己开的事务里运行是吧。
18:04
咱们简洁一点吧啊。嗯,虽然说反正你们也记不住是吧。反正他就表示。不管。嗯。当前,县城上。有没有事我都要自己开。事物啊,在自己的事物中。运行。我们下边这个。呃,下边写一下啊,就说这个require的这个默认值,它的这个顾虑。嗯,用别人的事物。有可能。背回滚。哎,有可能被回滚,就他自己自己没有出错,被别人回滚了,这个好处呢,就是说不会受到其他事物回滚的影响。
19:03
这个咱们就写一写,咱们就不不再用程序去测试了哈,因为这个是应该是我们学spring什么是事物的时候,这个是咱们讲过的。嗯。Roll back for,这个是我们的回滚的异常。哎,这个属性。这个是配置事物方法。呃,针对什么样的异常去回滚。那么它有默认情况。默认是根据运行时异常回滚。运行是异常叫啥呀。Run time exception runtime exception。那编译时异常它就不回滚了,那么我们希望它只要是异常就都回滚啊,所以说我们让他根据exception去回滚。
20:00
默认是运行时异常回滚。嗯,然后呢,我们建议呢,是。变异时异常和运行时异常都回滚。哎,所以说这边我们配一下这个Java点浪点exception。嗯,别的,你像这个事物的隔离级别呀,啊,那个超时啊等等,那个就是说我们有特殊需要就就栽培了。啊,这里边我们就配这几个。那么在这除了save的话,下边有这个update。Remove。假设如果有批量操作的话,再给他来一个断尺。哎,行了啊,这就是我们事物属性,这呢要做的这个配置就是这些。哎,这个一不留神全全都一出溜角了。啊,那就没在一块儿哈。这样吧,我这儿咱们就索性放一起吧。
21:03
这个就是。呃,具体的配置。呃,这个大家很配合,所以说这个我讲的就忘乎所以了。就一出溜就没有中间没有停。
我来说两句