目录
1. 什么是事务控制
简单来说,事务控制就是控制一件事情的完成性,成功则提交事务,失败则需要回调事务,什么意思呢,接下来举个例子:
假设开发一个转账的业务方法,我们设计的思路是数据库中,存放着用户的姓名和他们的财产值,dao层里存放的方法是两个方法,一条用于减少财产,一条用于增加财产,这时候我们业务层需要得到转出方和收款方以及金额数,调用方法就是转出方使用减少方法(这里用out方法代指),收款方使用增加方法(这里用in方法代指)。
所以在调用这个转账方法时,需要执行一个in一个out,而每次执行完一个in/out之后,数据库中的金额数已经更新了,倘若由于某些错误只执行了out,未执行in,而且数据库已经更新,那么这个out出的金额就白白消失,这种局面肯定是不愿见到的。
因此我们事务控制就是在这里,将in和out整合起来看为一个事务,当这个事务执行完整,也就是in和out都被执行了,这个事务才会提交(也就是才会算作是一次成功的无错的转账),若执行中出了错金额已经消失也没关系,因为事务检测到有错后,这个事务便不会提交,他会自动还原事务执行之前的样子(也就是消失金额变回来,这里叫做事务回调)
整体来看,事务控制其实就是基于AOP的思想实现的,整个过程好比我们事务控制方法和切点的织入。
2. 基于xml的声明式事务控制
2.1 导坐标
首先是导入坐标:
这里关键的spring-tx,里面有很多关于事务控制的api,同时也别忘了aop要用到的aspectj框架的坐标导入(参考前面的章节)。
2.2 需要事务控制的业务方法
附上一段源代码,这里就是我们转账的业务方法,accountdao就是调用了dao的in和out方法,我们在中间设置了一个int i=1/0的自杀式异常,接下来我们对他进行事务控制。
2.3 创建切点bean
来到xml配置文件
使用aop的思想,首先,我们的切点就是需要事务控制增强的这个transfer方法,这里导入bean
有了切点之后 ,我们需要通知,这里是事务通知也就是事务的增强,这里现在只需要声明,不需要自己写,首先创建一个tx命名空间,和这篇博文mvc命名空间的创建方法是一样的(1条消息) SSM框架学习7-SprigMVC数据响应_AAAristotle的博客-CSDN博客_ssm框架
2.4 配置通知(advice):事务的增强
这里就是我们通知的配置,在通知中我们需要一个事务管理器,这个管理器也是在xml里配置,通过bean注入,一般我们现在用到的控制dao层事务的管理器都是DataSourceTransactionManager(jdbc、mybatis等等),这个类是spring-tx封装好的我们直接创建bean后,往里注入一个dataSource即可使用(这里的dataSource类已经提前创建好bean,这个dataSource类里已经注入了相应的数据库信息。)
然后我们平台事务管理器就写入tarnsaction-manager参数中,在tx的attributes中配置method,name="*"。
2.4.1 <tx:attributes> 事务的属性
上图是对这个事务属性的解释,事务参数可以自行学习配置,不同业务方法可能会有不同的参数配置,比如在数据操作中:
这里的name代表不同的业务方法(要配入事务增强的业务方法,这里提前写入),这个参数可以个性化的配置,都是对我们事务执行的一个效果的配置,*代表通配符,全选,上面的update*代表以update开头的所有方法。
2.5 编写aop切面的织入
这里有专用的用于事务通知的切面的标签是<aop:advisor>,不同于前几章的aspect,但都是一个意思,然后是引用的通知就是上文中的txAdvice,我们的切点就是我们想使用的这个事务增强的业务方法,这里就不多赘述了,关于切点表达式的编写,在前两章也提到过。
到这里我们xml方式配置声明式事务控制就完成了,上面的方法和代码结构可以记,基本不会有太大变化。
3. 基于注解的声明式事务控制
其实就是将xml里可以变为注解的全变为注解,然后扫描即可
第一步:将所有的自定义类的bean写成注解配置方法,依赖注入也是用注解注入
第二步:配置context的组件扫描
第三步:将这块转为注解(分别是事务管理器配置、通知的配置、切点和通知的织入)
首先转换通知的配置和织入,只需要一个@Transactional注解即可,而且其事务的参数都可以填入后面的括号里,同时这个注解可以只用在一个方法上,代表只对这个方法进行事务控制,也可以配在整个类上,代表对整个类中所有方法进行事务控制。
而前面的事务管理器配置无法使用注解来设置,只能依旧通过如下方式配置,但是对于@Transactional注解,我们需要配置一个如下图所示的事物的注解驱动,而在这个驱动的参数中就有着我们的事务管理器的指定。
到这,所有的注解都串起来了,跟xml实现的作用是一样的,在通知和织入的配置中简便了许多
4. 测试
任选一种方式完成事务控制声明后,再次执行我们业务层的转账方法,这时即使执行过程中出任何差错了,也会保证金额不多不少,也就是他只会造成转账成功和不成功两种结果,这就是我们对这个转账的事务的一个安全的控制,说白了也就是控制整个业务的功能完整性,但凡出错就回调到业务没执行之前,防止业务中某些步骤已经对结果造成了影响。