思路分析:将编程式事务中的通用代码抽取出来,制作成独立的around通知使用AOP工作原理,将事务管理的代码动态织入到原始方法中。由于该功能使用量较大,Spring已经将该通知制作完毕。
1.开启tx命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
2.定义Spring提供的事务管理通知
<!-- 事务管理Advice,由Spring提供 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="transfer"/>
</tx:attributes>
</tx:advice>
注意:TxAdvice需要为其指定一个事务管理器的Bean
<!-- 声明事务管理器的Bean,该Bean依赖数据源对象 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property>
</bean>
3.设置AOP
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(void *..*.*.trans*(..))"/>
</aop:config>
4.将原始编程式事务控制中的控制代码删除
5.advice的参数
tx:advice:定义事务管理的通知(环绕通知)
transaction-manager:声明事务管理的实现类
tx:method:定义参与事务管理的方法
7.事务传播行为 配置的是事务协调员(事务加入者)针对事务管理员(事务发起者)所携带的事务的处理态度 事务管理者(业务) 事务协调员(数据) REQUIRED T1 T1 无 T2 REQUIRES_NEW T1 T2 无 T1 SUPPORTS NOT_SUPPORTED MANDATORY NEVER NESTED T1 无 T1 无 T1 无 T1 无 savePoint()
T1 无 无 无 T1 错误 错误 OK