spring boot 多数据源情况下,各自单独的service事务,只有默认的事务回滚,另一个子事务不回滚
主数据源配置:
@Configuration @MapperScan(basePackages = "com.project.master.mapper", sqlSessionFactoryRef="masterSqlSessionFactory" ) public class MasterDataSourceConfig{
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.masterDataSource")
@Primary
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager(@Qualifier("masterDataSource")DataSource masterDataSource) {
return new DataSourceTransactionManager(masterDataSource);
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource")DataSource masterDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:/mybatis-config.xml"));
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/project/master/xml/*.xml"));
return sessionFactory.getObject();
}
}
子数据源配置:
@Configuration @MapperScan(basePackages = "com.project.news.mapper", sqlSessionFactoryRef="newsSqlSessionFactory" ) public class NewsDataSourceConfig{
@Bean(name = "newsDataSource")
@ConfigurationProperties(prefix = "spring.datasource.newsDataSource")
public DataSource newsDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "newsTransactionManager")
public DataSourceTransactionManager newsTransactionManager(@Qualifier("newsDataSource")DataSource newsDataSource) {
return new DataSourceTransactionManager(newsDataSource);
}
@Bean(name = "newsSqlSessionFactory")
public SqlSessionFactory newsSqlSessionFactory(@Qualifier("newsDataSource")DataSource newsDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(newsDataSource);
sessionFactory.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:/mybatis-config.xml"));
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/project/news/xml/*.xml"));
return sessionFactory.getObject();
}
}
各自的service调用:
@Transactional("masterTransactionManager")//此处不指定名称,一样有效 public void test(){ UserInfo userInfo = new UserInfo(); userInfo.setId(1); userInfo.setNum(1); userInfoMapper.setUserInfo(userInfo);//更新id=1的用户的num为1 throw new RuntimeException("主数据源 手动抛出异常"); }
@Transactional("newsTransactionManager")//无效 public void test2(){ News news = new News(); news.setId(1); news.setNum(1); newsMapper.setNews(news);//更新id=1的新闻的num为1 throw new RuntimeException("子数据源 手动抛出异常"); }
newsTransactionManager 这个事务无效,异常不会回滚,请教这地方应该怎么处理?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
似乎只能写个类继承一下,然后切换数据源######楼主解决了没有这个问题,我也遇到了同样的问题######你说的 newsTransactionManager 为什么我的指定名称可以,你的指不指定都不行吗######spring 的事务跟数据源没有关系的啊,你为什么要去配置两个
DataSourceTransactionManager https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources