一、事务的配置
1、@Transactional的使用配置
需要在配置文件中添加<tx:annotation-driven transaction-manager="事务名称" />才能起作用
如果事务的名称不是默认的transactionManager,那么在使用@Transactional注解的每个地方都要加上该事务名称
2、spring通过aop传播事务配置
<!-- 事务管理器配置, Hibernate数据源事务 -->
<bean id="transactionManagerUsers" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactoryUsers" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerUsers" />
<!-- AOP注入事务 -->
<aop:config>
<aop:pointcut id="servicePointCut" expression="execution(* com.test.users.service..*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointCut"/>
</aop:config>
<!-- 配置事务传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManagerUsers">
<tx:attributes>
<!-- all methods starting with 'get/search/find/load' are read-only -->
<tx:method name="get*" read-only="true" propagation="REQUIRES_NEW"/>
<tx:method name="search*" read-only="true" propagation="REQUIRES_NEW"/>
<tx:method name="find*" read-only="true" propagation="REQUIRES_NEW"/>
<tx:method name="loadResourceDefine" read-only="true" propagation="REQUIRES_NEW"/>
<!-- other methods use the default transaction settings (see below) -->
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
那么com.test.users.service包下面的方法都将拥有事务
二、@Transactional与spring通过aop传播配置事务的相互作用
1、使用@Transactional的时候,在同一个类方法下配置多个@Transactional,比如
@Service
public class PerceptionSendNewsManager {
@Transactional(value="transactionManagerMsgs",propagation=Propagation.NOT_SUPPORTED)
public void saveMessage(Tinbox tinbox){
saveTinbox(tinbox);
}
@Transactional(value="transactionManagerMsgs",propagation=Propagation.REQUIRED)
public void saveTinbox(Tinbox entity) {
xxxx......
}
那么在调用saveMessage方法的时候,方法saveTinbox的事务是不起作用的,也就是说在同一个类中的方法A调用该类中的其它方法B,B方法定义的事务是不起作用的,
但是如果B方法的事务是通过aop传播配置的,那么B方法的事务还是会起作用
经过测试总结如下
(1)、当一个方法即有配置@Transactional,又包含在spring通过aop传播配置的事务时,@Transactional配置将覆盖spring通过aop传播配置的事务
(2)、当一个类的两个方法A、B,都有注解@Transactional,如果A调用B的话,那么B通过@Transactional配置的事务将不起作用,但是在B方法上通过springaop传播配置的事务会起作用,可以理解为B方法上没有注解@Transactional事务,所以Aop传播的事务将起作用