我使用的是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);
但是如下配置,提交不起作用(没有数据插入表),也没有错误信息。
@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文件。
关于java - SpringBoot,手动控制两个数据源,事务失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60650538/