在多数据源中配置事务,其实对于SpringBoot来很简单,当然这个的前提是首先把多数据源都配好的情况下,如果不会多数据源配置,请看该系列
SpringBoot整合多数据源
- 首先在启动类配置
@SpringBootApplication
@EnableTransactionManagement
public class AccountApplication {
public static void main(String[] args) {
SpringApplication.run(AccountApplication.class, args);
}
}
当配置了这个事务注解,会自动去加载我们的事务Bean。
配置多个事务
- 事务1
@Bean(name = "accountTransactionManager")
@Primary
public PlatformTransactionManager testTransactionManager(@Qualifier("accountDataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
return dataSourceTransactionManager;
}
- 事务2
@Bean(name = "otoSaaSTransactionManager")
public PlatformTransactionManager testTransactionManager(@Qualifier("otoSaaSDataSource") DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(dataSource);
return dataSourceTransactionManager;
}
这个是时候就可以指定用哪个事务处理
- 使用事务1
@Override
@Transactional(value = "accountTransactionManager",rollbackFor = Exception.class)
public boolean insertAddMoney(String account, String quota) {
...
}
- 使用事务2
@Override
@Transactional(value = "otoSaaSTransactionManager",rollbackFor = Exception.class)
public boolean insertAddMoney(String account, String quota) {
...
}
那么此时就产生了一个疑惑,在多数据源和事务管理器中,如果不指定默认返回的事务呢?怎么配置默认事务处理器呢?
很简。添加一个配置类,实现 TransactionManagementConfigurer
重写 annotationDrivenTransactionManager
方法
返回默认返回的处理器,就OK
@Configuration // 开启注解事务管理,等同于xml配置文件中的 <tx:annotation-driven />
public class AccountApplication implements TransactionManagementConfigurer {
@Resource(name="txManager2")
private PlatformTransactionManager txManager2;
// 创建事务管理器1
@Bean(name = "txManager1")
public PlatformTransactionManager txManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// 创建事务管理器2
@Bean(name = "txManager2")
public PlatformTransactionManager txManager2(EntityManagerFactory factory) {
return new JpaTransactionManager(factory);
}
// 实现接口 TransactionManagementConfigurer 方法,其返回值代表在拥有多个事务管理器的情况下默认使用的事务管理器
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager2;
}
public static void main(String[] args) {
SpringApplication.run(AccountApplication.class, args);
}
}