基于XML的声明式事务控制

本文最后更新于:2 年前

什么是声明式事务控制

Spring 的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务

声明式事务处理的作用

  • 事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可
  • 在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便。

注意:Spring 声明式事务控制底层就是AOP。

快速入门

声明式事务控制明确事项:

  • 谁是切点?
  • 谁是通知?
  • 配置切面?

1. 引入tx命名空间

1
2
xmlns:tx = " …… http://www.springframework.org/schema/tx "
xsi:schemaLocation = " …… http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd "

2. 配置事务增强

1
2
3
4
5
6
7
8
9
10
11
<!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!--通知,事务的增强-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>

3. 配置事务 AOP 织入

1
2
3
4
<!--配置事务的aop织入-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* cc.gaojie.service.impl.*.*(..))"></aop:advisor>
</aop:config>

4. 测试事务控制转账业务代码

1
2
3
4
5
6
7
8
9
10
11
12
13
public class AccountServiceImpl implements AccountService {

private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; }

@Override
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
//制造异常中断后续事务
int i = 1 / 0;
accountDao.in(inMan,money);
}
}

数据库无任何更新,说明异常前后的事务都被控制住了。

切点方法的事务参数说明

<tx:attributes> 内部,可以对不同方法(事务)进行配置,每个事务可以分别配置属于该事务自己的一些属性参数。

其中,<tx:method> 代表切点方法的事务参数的配置,例如:

1
2
3
4
5
6
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="findAll" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="true"/>
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/> //表示所有update开头的方法
</tx:attributes>
</tx:advice>
  • name:切点方法名称
  • isolation:事务的隔离级别
  • propogation:事务的传播行为
  • timeout:超时时间
  • read-only:是否只读

知识要点

初始环境

pojo

database

dao

service

controller

applicationContext.xml