SSM框架学习15-事务控制

目录

1. 什么是事务控制

2. 基于xml的声明式事务控制

2.1 导坐标

2.2 需要事务控制的业务方法

2.3 创建切点bean

2.4 配置通知(advice):事务的增强

2.4.1 事务的属性

2.5 编写aop切面的织入

3. 基于注解的声明式事务控制

4. 测试


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. 测试

任选一种方式完成事务控制声明后,再次执行我们业务层的转账方法,这时即使执行过程中出任何差错了,也会保证金额不多不少,也就是他只会造成转账成功和不成功两种结果,这就是我们对这个转账的事务的一个安全的控制,说白了也就是控制整个业务的功能完整性,但凡出错就回调到业务没执行之前,防止业务中某些步骤已经对结果造成了影响。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值