编程式事务控制相关对象(了解一下)
这就是接口的作用:行为固定好,但具体的实现不一样。
上面的了解一下就行了,不用深究
基于xml的声明式事务管理
什么是声明式事务控制?
转账实例
数据库中一开始各有五千:
图中可以看出,我们在service业务层实现转账的功能:out转出,in转入
但是此时我们如果人为的造了一个异常在这两行代码中间,则会出现out已经转出了,可是因为异常终止了程序,导致转出的钱却没有进入该进入的账户,如下图:
所以我们需要对这个程序进行事务控制,原始方法就是简易的将这段代码用try-catch-finally包裹起来,有异常回滚事务就行,如下图:
但现在出现了问题,如果业务层中有成百上千的方法,岂不是都得try-catch抓一下?那么代码很冗余,所以我们还是用老办法将他们提取出来,使用aop的织入思想,将需要编辑为事务的业务方法看做切面(即需要被加强的方法),然后把事务的添加看做方法的增强织入进去即可。Spring在底层已经帮我们封装好了,我们现在要做的,就是声明就行。
声明式事务的实现
声明式事务控制明确事项:
1、谁是切点?
2、谁是通知?
3、配置切面?
先快速入门,后面再详细解释各代码意思。
注意使用tx事务关键字时,需要在头部的约束文件中写入tx,就跟写context和aop一样。
详解一下,第一个点,平台事务管理器必须要陪,因为我们的通知它内部是需要一个平台事务管理器的,但是有一点要特别注意:如果我们DAO层的实现不是原生的JDBC,不是JDBC模板,不是Mybatis而是其他的,那么我们的平台事务管理器的实现DataSourceTransactionManager会跟着变。意思就是不同的DAO层的技术实现就用不同的平台事务管理器就行。
然后配置事务的织入也没啥好说的,如下图,aop:advisor事务的织入;
advice-ref:增强事务的引入,pointcut切点:业务层中的业务方法呗。
重点是事务的增强部分:
id就是标识,transaction-manager就是引用平台事务管理器,都好理解,主要是中间那一块儿tx:attributes
tx:attributes :设置事务的属性信息的
tx:method name = “*”:切点的点的意思就是方法,这句话的意思就是“哪些方法需要被事务增强”,而name后面的*意思就是所有方法都要被事务增强。
tx:attributes 内部可以声明多个属性,而事务的隔离级别可以在括号后面逐一写上。另外如下图中的"update*"的意思就是以update开头的所有的方法。
总结就是:
基于注解的声明式事务管理
如图所示,注解方法声明式事务管理只需要在对应的业务方法上使用@Transactional注解就可以了,对应的参数可以在后面括号内设置。
同时这个注解也可以使用在类上,表示当前类下的所有业务方法都使用这个注解所配置的事务配置操作。如果类上方法上同时有这个注解,则采用就近原则,方法会受到自己方法上的事务操作的配置而非类上的。
同时使用了注解方法后,还要告知Spring才行,也就是在Spring的配置文件中加上注解驱动。
不加的话@Transactional就不会起作用。
还要一点自己的理解:所谓的平台事务管理器,其实应该就是数据源的位置,我们的事务控制住了肯定会有一个平台在反应是否被控制住嘛,那我们这里就是mysql数据库嘛。