springboot的事务回滚
时间: 2023-10-29 14:00:53 浏览: 95
在SpringBoot中,事务回滚的规则是只有在抛出运行时异常时才会回滚事务。如果一个方法被声明为@Transactional,那么如果这个方法中的任何一个步骤失败了(比如抛出了异常),则该事务将会回滚到之前的状态。需要注意的是,如果一个带有@Transactional注解的方法调用了另一个带有@Transactional注解的方法,则内部方法的异常会回滚整个事务。另外,如果一个没有被声明为@Transactional的方法抛出异常,则只会回滚这个方法的事务。
为了确保事务自动回滚,我们可以在service的public方法上面加上@Transactional注解,并设置rollbackFor属性为Exception.class。这样一旦程序出现异常,事务会自动回滚。也可以在方法级别上加上@Transactional注解,这样可以对单个方法进行事务管理。
总的来说,SpringBoot的事务回滚机制可以保证数据的一致性和完整性,当出现异常时可以回滚到之前的状态,确保事务的原子性操作。
相关问题
springboot事务回滚
在Spring Boot中,可以通过在Service实现层的方法上添加@Transactional注解来开启事务。但是默认情况下,@Transactional注解只会捕捉RuntimeException和Error异常,对于Exception异常需要手动捕捉才能使@Transactional注解生效。如果不手动捕捉Exception异常,@Transactional注解将失效。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [Springboot基础系列:事务回滚](https://blog.csdn.net/Xin_101/article/details/109183566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
SpringBoot事务回滚
### Spring Boot 事务回滚机制
在 Spring Boot 中,`@Transactional` 注解用于声明式事务管理。当方法被标记为此注解时,Spring 将创建一个代理对象来控制事务边界并处理异常情况。
如果目标方法内发生未被捕获的 `RuntimeException` 或其子类,则默认情况下会触发事务回滚[^1]。对于受检异常,默认不会引发回滚行为;但是可以通过设置属性来自定义这一规则:
#### 自动回滚配置
为了实现更精细的控制,可以调整 `rollbackFor` 和 `noRollbackFor` 属性指定哪些类型的异常应该引起或不引起回滚:
```java
@Override
@Transactional(
rollbackFor = {SQLException.class, DataAccessException.class},
noRollbackFor = IllegalArgumentException.class
)
public void processTransaction() {
// 方法体...
}
```
上述例子表明任何由 SQL 执行失败引起的异常都将导致事务回滚,而非法参数异常则不会影响已有的更改提交给数据库[^3]。
#### 显式编程方式
除了依赖于自动检测之外,还可以通过编程手段显式地标记当前事务状态为需要回滚的状态。这通常是在捕获特定业务逻辑错误之后完成的操作:
```java
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.PersistenceException;
@Service
class OrderService {
private final EntityManager entityManager;
@Autowired
public OrderService(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Transactional
public void placeOrder(Order order) throws Exception {
try {
validate(order);
saveOrder(order);
} catch (BusinessRuleViolationException ex) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw new OrderPlacementFailedException("订单放置失败", ex);
}
}
private void validate(Order order){
if(!order.isValid()){
throw new BusinessRuleViolationException("无效订单");
}
}
private void saveOrder(Order order){
entityManager.persist(order);
}
}
```
在这个案例里,一旦遇到违反商业规则的情况就会立即请求回滚整个事务,并且重新抛出自定义的应用程序级别异常以便进一步处理[^2]。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)