Spring 条件下启动回滚事务
Spring boot rollback transaction on condition
我正在使用 Spring boot 2.4.4 和 Webflux。
我的用例是在某些情况下回滚事务。
公开一个 REST 端点。收到请求后,
- 插入订单table
- 插入订单测试table
- 调用远程服务通知订单
- 从删除服务接收到错误时回滚订单 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 })
我正在使用 Spring boot 2.4.4 和 Webflux。 我的用例是在某些情况下回滚事务。
公开一个 REST 端点。收到请求后,
- 插入订单table
- 插入订单测试table
- 调用远程服务通知订单
- 从删除服务接收到错误时回滚订单 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 })