什么是声明式事务控制
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: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:是否只读
知识要点
初始环境