SpringBoot,手动控制两个数据源,事务失败

SpringBoot, manual control of two data sources, transaction failed

我正在使用 SpringBoot 2.1。8.RELEASE,我有两个数据源,我手动控制事务。 事务(标记为“@Primary”)有效。但是,标记为另一个数据源的事务无法正常工作。 你有什么建议吗?

Maven配置如下

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

other omit...

一个数据源配置如下:

@Configuration
@MapperScan(basePackages = {"com.XXX.XXXX.mapper","com.XXX.XXX.common.mapper"},sqlSessionFactoryRef = "masterSqlSessionFactory")
public class ProductDataSourceConfig {
    static final String MAPPER_LOCATION = "classpath:mybatis/MYSQL/*.xml";


    @Bean(name = "masterDataSource")
    @ConfigurationProperties("spring.datasource.product")
    public DataSource masterDataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "masterTransactionManager")
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")

    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(ProductDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

另一个数据源配置如下:

@Configuration
@MapperScan(basePackages = "com.XXX.XXX.mapperTest",sqlSessionFactoryRef = "secondSqlSessionFactory")
public class TestDataSourceConfig {
    static final String MAPPER_LOCATION = "classpath:mybatis/TESTMYSQL/*.xml";

    @Primary
    @Bean(name = "secondDataSource")
    @ConfigurationProperties("spring.datasource.test")
    public DataSource clusterDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Primary
    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(TestDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

当配置如下时,按预期提交(在“@Primary”数据库中,插入记录)。

@Autowired
DataSourceTransactionManager dataSourceTransactionManager;

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setTimeout(500);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);

insertTmemberEnterRecord(bean);

dataSourceTransactionManager.commit(transactionStatus);

但是下面的配置如下,提交是不行的(No data inserted into table),也没有报错。

@Qualifier("masterTransactionManager")
@Autowired
DataSourceTransactionManager dataSourceTransactionManager;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setTimeout(500);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(def);

insertTmemberEnterRecord(bean);

dataSourceTransactionManager.commit(transactionStatus);

欢迎提出任何建议。

我解决了这个问题。 原因是对应的mapper文件也要用到。