如何在Spring中创建一个@Transaction来控制两个不同数据库的回滚?



我有两个不同的数据库oracle。

我已经使用SpringBoot实现了两个数据库的配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "br.com.xyz.univers.ms.universcontractsync.repository.universcontract",
entityManagerFactoryRef = "universContractEntityManagerFactory",
transactionManagerRef= "universContractTransactionManager"
)
public class UniversContractDatasourceConfiguration {
@Bean
@ConfigurationProperties("app.datasource.universcontract")
public DataSourceProperties universContractDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("app.datasource.universcontract.hikari")
public DataSource universContractDataSource() {
return universContractDataSourceProperties().initializeDataSourceBuilder()
.type(HikariDataSource.class).build();
}
@Bean(name = "universContractEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean universContractEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(universContractDataSource())
.packages("br.com.xyz.univers.ms.universcontractsync.models.universcontract")
.build();
}
@Bean(name = "universContractTransactionManager")
public PlatformTransactionManager universContractTransactionManager(
final @Qualifier("universContractEntityManagerFactory") LocalContainerEntityManagerFactoryBean universContractEntityManagerFactory) {
if (universContractEntityManagerFactory == null) {
throw new SyncUnknowException("universContractEntityManagerFactory is null");
}
EntityManagerFactory entityManagerFactory = universContractEntityManagerFactory.getObject();
if (entityManagerFactory == null) {
throw new SyncUnknowException("entityManagerFactory is null");
}
return new JpaTransactionManager(entityManagerFactory);
}
}

问题是,当一个方法调用两个数据库时,我如何控制事务?这是必要的,因为我的方法需要所有这两个数据库。

方法示例:

@Override
@Transactional("chainedTransactionManager")
public void save(CompanyDTO companyDTO) {
log.info("method=save  ' - CompanyServiceImpl");
CompanyDTO companyDTOWithLegacyCode = companyDTO.toBuilder().build();
legacyCodeService.changeToLegacyCode(companyDTOWithLegacyCode);
Company company = companyBuilder.universContractDtoToSisbfEntity(companyDTOWithLegacyCode);
companyRepository.save(company);
legacyCodeService.updateLegacyCode(ClassTypeEnum.COMPANY, companyDTO.getCompanyCode(), company.getCompanyCode());
log.info("finish method=save  ' - CompanyServiceImpl");
}

通过显式指定其值来为两个数据库使用@Transactional注释。例子@ transactional (value ="chainedTransactionManager"。所以弹簧会处理这个

最新更新