Spring 条件下启动回滚事务

Spring boot rollback transaction on condition

我正在使用 Spring boot 2.4.4 和 Webflux。 我的用例是在某些情况下回滚事务。

公开一个 REST 端点。收到请求后,

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

代码

@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();
                                        });
                        });
            });

        });
    }

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

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