【发布时间】:2020-07-09 02:31:30
【问题描述】:
我的应用程序在带有 postgres 数据库的 Spring MVC 4.2 上。在我的应用程序中,我们正在使用一个使用 Spring Boot 编写的 API,该 API 具有自己的数据库 (mysql)。
@Transaction(rollbackfor = Exception.class)
updateOrder(Order order) {
// This insert is part of my application
update(order); //**STEP - 1**
//This is not part of our application &
// happening in api written in spring boot.
Integer transactionId = updateOrderWorkflow(order);// **STEP - 2**
//Below updateOrderWithTransactionId is part of my application
//Updates the order with the transaction Id
updateOrderWithTransactionId(order, transactionId); //**STEP - 3**
}
如果 STEP-3 失败,那么我必须回滚在消费 api 中所做的更改。对于回滚,我编写了补偿/回滚方法,它可以回滚到旧的工作流状态。
现在的问题场景:
如果一个进程 (PROCESS_1) 正在处理上述 updateOrder() 方法并到达 STEP-3,但在此进程在 STEP-3 中失败之前,另一个进程 (PROCESS_2) 尝试访问 updateOrder() 方法并更新第2步。现在PROCESS_1在STEP-3失败,调用补偿/回滚方法,但PROCESS_2成功完成STEP-3。
这会造成数据不一致。这种情况如何处理?
【问题讨论】:
-
听起来第 2 步中的外部 API 需要更改 - 您可以控制它吗?
-
是的,这也是我们创造的。
标签: java spring spring-boot spring-mvc spring-data