spring boot 全局异常处理无法直接捕获事务回滚点(savepoint)触发的异常,因为 savepoint 本身不抛出异常,它只是标记了一个状态。要捕获回滚点相关的错误,必须通过 @transactional 注解的 rollbackfor 属性指定需要触发回滚的异常类型,并在 @controlleradvice 中统一拦截这些异常进行处理。

如何配置事务回滚的具体异常类型
在 Spring Boot 中,默认情况下只有运行时异常(RuntimeException)和 Error 会触发事务回滚,而检查型异常(Checked Exception)不会。如果你希望特定的业务异常或自定义异常也能触发回滚,需要在 @Transactional 注解中显式声明 rollbackFor 参数。这样,当代码块中抛出该异常时,Spring 的事务管理器会识别并执行回滚操作,而不是继续提交事务。

import org.springframework.transaction.annotation.Transactional;
@Service
public class OrderService {
@Transactional(rollbackFor = BusinessException.class)
public void createOrder(Order order) {
// 业务逻辑
if (order.getAmount() < 0) {
throw new BusinessException("金额不能为负");
}
// 保存订单
}
}
上述代码展示了如何在 Service 层配置事务回滚。当 createOrder 方法抛出 BusinessException 时,事务会自动回滚。这确保了数据的一致性,防止部分数据被持久化到数据库中。开发者只需关注异常的抛出,无需手动管理事务的回滚逻辑。
全局异常处理器如何捕获回滚引发的异常
全局异常处理器通过 @RestControllerAdvice 或 @ControllerAdvice 配合 @ExceptionHandler 来捕获异常。当 @Transactional 方法因异常触发回滚时,该异常会向上传播至控制器层,最终被全局异常处理器捕获。处理器可以返回统一的错误响应格式,如 JSON 结构,包含错误码、消息等信息,便于前端或调用方处理。

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<String> handleBusinessException(BusinessException ex) {
return ResponseEntity.badRequest().body(ex.getMessage());
}
}
这段代码定义了一个全局异常处理器,专门处理 BusinessException。当 OrderService 抛出该异常并触发事务回滚后,异常传播到此处理器,返回 HTTP 400 状态码及错误消息。这种机制将事务管理与异常处理解耦,提高了代码的可维护性。开发者只需确保异常类型匹配,即可实现自动化的错误响应。
基于@Transactional注解中rollbackFor参数的具体应用问题
在使用 @Transactional 时,如果未正确配置 rollbackFor,可能导致某些异常未被回滚,从而引发数据不一致。例如,若仅依赖默认行为,检查型异常不会触发回滚,需显式指定。此外,多个异常类型可通过数组形式配置,如 rollbackFor = {BusinessException.class, DataAccessException.class},以覆盖多种场景。开发者应根据业务需求,精确选择需要回滚的异常类型,避免过度或不足的配置。


















