事务回滚的propagation配置
时间: 2023-11-09 22:05:40 浏览: 25
事务回滚的propagation配置是指在一个事务中,如果其中一个方法抛出了异常并导致事务回滚,那么这个异常应该如何传播到包含该方法的上一层方法。在Spring框架中,事务回滚的propagation配置有以下几种:
1. REQUIRED:如果当前有事务正在运行,那么该方法就在该事务中执行。否则,就启动一个新的事务,并在其中执行该方法。如果方法抛出异常,那么整个事务都会回滚。
2. REQUIRES_NEW:无论当前是否有事务正在运行,该方法都会启动一个新的事务,并在其中执行。如果方法抛出异常,那么只有当前的事务会回滚,而不会影响其他事务。
3. NESTED:如果当前有事务正在运行,那么该方法就在该事务的嵌套事务中执行。否则,就启动一个新的事务,并在其中执行。如果方法抛出异常,那么只有该嵌套事务会回滚,而不会影响其他事务。
4. SUPPORTS:如果当前有事务正在运行,那么该方法就在该事务中执行。否则,就不启动事务,直接执行该方法。
5. NOT_SUPPORTED:如果当前有事务正在运行,那么该方法就挂起该事务,并在没有事务的情况下执行该方法。执行完成后,再恢复原来的事务。
6. NEVER:如果当前有事务正在运行,那么该方法就抛出异常,否则就直接执行该方法。
7. MANDATORY:如果当前没有事务正在运行,那么该方法就抛出异常,否则就在该事务中执行。
通过合理的propagation配置,可以控制事务的传播行为,从而实现对业务逻辑的可靠控制。
相关问题
springboot ThreadPoolTaskExecutor 子线程如何进行事务回滚
在Spring Boot中,如果你想要在子线程中进行事务回滚,可以使用`@Async`注解和`@Transactional`注解的组合来实现。下面是一个示例代码:
```java
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingInAsync() {
try {
// 在子线程中执行数据库操作
myRepository.save(someEntity);
} catch (Exception e) {
// 处理异常
}
}
}
```
在上面的代码中,`@Async`注解表示该方法将在一个单独的线程中执行,而`@Transactional(propagation = Propagation.REQUIRES_NEW)`注解表示在子线程中创建一个新的事务。如果在子线程中发生异常,事务将会回滚。
需要注意的是,为了使`@Async`注解生效,你需要在Spring Boot的配置类中添加`@EnableAsync`注解。
springboot 全局事务配置
在SpringBoot中配置全局事务需要使用Spring的事务管理器和注解@Transactional。下面是一个简单的全局事务配置示例:
1. 配置数据源
在application.properties文件中配置数据源相关信息:
```
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
```
2. 配置事务管理器
创建一个配置类,配置事务管理器:
```java
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
```
3. 开启全局事务
在需要开启事务的方法上添加@Transactional注解即可:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional
public void addUser(User user) {
userDao.addUser(user);
}
}
```
其中@Transactional注解的属性可以根据需要进行配置,例如:
- propagation:事务的传播行为,默认值为REQUIRED。
- isolation:事务的隔离级别,默认值为DEFAULT。
- readOnly:指定事务是否为只读,默认值为false。
- timeout:指定事务的超时时间,默认值为-1(表示使用数据库默认超时时间)。
这样配置之后,当执行addUser方法时,如果出现异常或者抛出RuntimeException,则整个方法会进行回滚,保证数据一致性。