开发者社区 问答 正文

spring boot 多数据源情况下不回滚 : 配置报错 

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 这个事务无效,异常不会回滚,请教这地方应该怎么处理?

展开
收起
kun坤 2020-06-03 16:14:29 1027 分享 版权
1 条回答
写回答
取消 提交回答
  • 似乎只能写个类继承一下,然后切换数据源######楼主解决了没有这个问题,我也遇到了同样的问题######你说的 newsTransactionManager 为什么我的指定名称可以,你的指不指定都不行吗######spring 的事务跟数据源没有关系的啊,你为什么要去配置两个 

    DataSourceTransactionManager https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-two-datasources
    2020-06-05 14:24:27
    赞同 展开评论