实际应用场景有个项目在配置Spring事务时,使用了@Transactional注解,但这个项目使用了多个数据源,而事务注解只对默认的是第一个事务
1)定义与事务管理器对应的事务通知
2)配置需要拦截的方法调用切面
3)将切入点连接到相应的事务
在Spring2.5之前,@Transactional注解确实不支持多数据源,但是Spring3为其增加了value属性配置,可以指定当前事务通知对应的事务管理器
1、配置事务注解驱动、每个数据源对应的事务管理器,并定义“限定符”
<!-- 开启注解式事务扫描 -->
<tx:annotation-driven/>
<bean id="transactionManager1" class="org.springframework.jdbc.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource1">
<qualifier value="transmanage1"/>
</bean>
<bean id="transactionManager2" class="org.springframework.jdbc.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource2">
<qualifier value="transmanage2"/>
</bean>
2、在需要事务的地方,指定“限定符”
public class TransactionalService {
@Transactional("transmanage1")
public void setSomething(String name) { ... }
@Transactional("transmanage2")
public void doSomething() { ... }
}
3、如果不指定“限定符”,将默认使用“transationManager”命名对应的事务管理器
在配置文件中,默认情况下,<tx:annotation-driven>会自动使用名称为transactionManager的事务管理器。所以,如果定义的事务管理器名称为transactionManager,那么就可以直接使用<tx:annotation-driven/>
@Transactional的属性
这里写图片描述
配置优化
可以自定义一个绑定到特定事务管理器的注解,然后直接使用这个自定义的注解进行标识:
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional("transmanage1")
public @interface CustomerTransactional {
}
在Service代码中使用:
...
//使用名为transmanage1的事务管理器
@CustomerTransactional
public void addTest(String str){
}