首页 > 解决方案 > 有条件的 Spring Boot 回滚事务

问题描述

我正在使用带有 Webflux 的 Spring Boot 2.4.4。我的用例是在某些条件下回滚交易。

公开 REST 端点。接到请求后,

  1. 插入订单表
  2. 插入订单测试表
  3. 调用远程服务通知订单
  4. 从删除服务接收错误时回滚订单表和订单测试表条目。

代码

@Transactional
    public Mono<ServerResponse> submitOrder(final ServerRequest request) {
        return request.bodyToMono(OrderDto.class).flatMap(orderDto -> {
            return orderRepository.save(toOrder(orderDto)).flatMap(order -> {
                return orderTestRepository
                        .saveAll(toOrderTestList(orderDto.getTestList())).collectList()
                        .flatMap(labTestRes -> {
// Need to rollback transaction if the below service call is not success
                                return removeService.submitOrder(orderDto, labOrder.getOrderId())
                                        .flatMap(orderNum -> {
                                            return noContent().build();
                                        });
                        });
            });

        });
    }

标签: spring-bootspring-webfluxspring-transactions

解决方案


如果您removeService在不成功的服务调用上引发异常,请将您的修改@Trasactional@Transactional(rollbackFor = ThatException.class). 如果不是,则抛出自定义异常并将注释更改为@Transactional(rollbackFor = CustomException.class). 您还可以回滚多个异常,例如:

@Transactional(rollbackFor = { Exception1.class, Exception2.class })

推荐阅读