在Java中配置雙數據源回滾可以通過使用@Transactional
注解來實現。@Transactional
注解可以應用在方法上,表示該方法是一個事務方法,當方法執行過程中發生異常時,會自動回滾事務。
首先,需要確保你的項目中已經引入了Spring事務管理的依賴,比如spring-boot-starter-data-jpa
和spring-boot-starter-jdbc
。
接下來,需要在配置文件(比如application.properties或application.yml)中配置兩個數據源,并分別指定其對應的事務管理器。例如:
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/db1
username: root
password: password
secondary:
url: jdbc:mysql://localhost:3306/db2
username: root
password: password
jpa:
database-platform: org.hibernate.dialect.MySQL5Dialect
hibernate.ddl-auto: update
jta:
enabled: true
接下來,需要創建兩個數據源的配置類,用于配置數據源和事務管理器。例如:
@Configuration
@EnableTransactionManagement
public class PrimaryDataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Configuration
@EnableTransactionManagement
public class SecondaryDataSourceConfig {
@Bean(name = "secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
最后,在你的Service層方法上添加@Transactional
注解,并指定對應的事務管理器。例如:
@Service
public class ExampleService {
@Autowired
@Qualifier("primaryTransactionManager")
private PlatformTransactionManager primaryTransactionManager;
@Autowired
@Qualifier("secondaryTransactionManager")
private PlatformTransactionManager secondaryTransactionManager;
@Transactional(rollbackFor = Exception.class, transactionManager = "primaryTransactionManager")
public void saveToPrimaryDataSource(Data data) {
// 保存數據到主數據源
}
@Transactional(rollbackFor = Exception.class, transactionManager = "secondaryTransactionManager")
public void saveToSecondaryDataSource(Data data) {
// 保存數據到從數據源
}
}
以上配置中,@Transactional
注解通過transactionManager
屬性指定了對應的事務管理器,從而實現了雙數據源的回滾。