springboot同一方法内2个数据源,如何统一事务回滚
时间: 2024-03-21 13:43:16 浏览: 107
在Spring Boot中,如果一个方法中需要操作多个数据源并且需要统一事务回滚,可以使用JTA(Java Transaction API)来实现。JTA可以协调多个事务管理器,确保多个数据源的事务可以被统一控制和回滚。
首先,需要在pom.xml文件中引入JTA的依赖:
```xml
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>
```
然后,在Spring Boot的配置文件中,配置两个数据源及其对应的事务管理器:
```yaml
spring:
datasource:
primary:
url: jdbc:mysql://localhost:3306/primary?serverTimezone=UTC
username: primary
password: primary
driver-class-name: com.mysql.cj.jdbc.Driver
secondary:
url: jdbc:mysql://localhost:3306/secondary?serverTimezone=UTC
username: secondary
password: secondary
driver-class-name: com.mysql.cj.jdbc.Driver
jta:
enabled: true
```
需要设置`spring.jta.enabled`为true,表示启用JTA事务管理器。然后在代码中使用`@Transactional`注解来控制事务,例如:
```java
@Service
@Transactional
public class UserService {
@Autowired
private UserPrimaryRepository userPrimaryRepository;
@Autowired
private UserSecondaryRepository userSecondaryRepository;
public void addUser(User user) {
userPrimaryRepository.addUser(user);
userSecondaryRepository.addUser(user);
}
}
```
在上面的代码中,`@Transactional`注解用于控制事务,表示如果方法执行失败,两个数据源的事务都会回滚。由于启用了JTA事务管理器,因此Spring会自动将两个数据源的事务纳入到同一个全局事务中,从而实现了事务的统一控制和回滚。
阅读全文