spring-boot - 有条件的 Spring Boot 回滚事务
问题描述
我正在使用带有 Webflux 的 Spring Boot 2.4.4。我的用例是在某些条件下回滚交易。
公开 REST 端点。接到请求后,
- 插入订单表
- 插入订单测试表
- 调用远程服务通知订单
- 从删除服务接收错误时回滚订单表和订单测试表条目。
代码
@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 })
推荐阅读
- java - Java 按所需字符串排序
- php - 数据不在移动设备上插入,但在桌面上工作 - Codeigniter 和 Ajax
- javascript - 为什么 JEST 测试由于 puppeteer 关闭浏览器而失败
- r - 如何矢量化一个循环,该循环对于每一行,求和该实体 ID 在 r 中的当前条目和所有先前条目之间经过的时间的函数
- javascript - 如何比较更多三个数组?
- r - writeLines() 转换后返回空白.txt -r tm 包
- java - Android Studio SharedPreferences 和字体样式
- swift - 在 tvOS 上更改 SwiftUI 中按钮的颜色
- kubernetes - 如何在由 ReplicaSet/Deployment 创建的 Pod 上创建 LoadBalancer 服务
- python - selenium:无法通过键盘访问