Я использую 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);
Любые предложения приветствуются.