我的应用程序在Spring 4.2和postgres数据库上。在我的应用程序中,我们使用了一个API,它是使用spring编写的,它有自己的数据库(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**
}如果步骤3失败,那么我必须回滚在消费api中所做的更改。对于回滚,我编写了补偿/回滚方法,该方法回滚到旧的工作流状态。
现在是问题场景:
如果一个进程(PROCESS_1)正在处理上述updateOrder()方法并达到步骤3,但在步骤3中此进程失败之前,另一个进程(PROCESS_2)尝试访问updateOrder()方法并更新步骤2。现在,PROCESS_1在步骤3中失败,它调用补偿/回滚方法,但是PROCESS_2成功地完成了步骤3。
这会造成数据不一致。如何处理这种情况?
发布于 2020-03-28 18:05:55
听起来问题是,步骤2中的updateOrderWorkflow公开了PROCESS_1事务在提交之前所做的更改。
我要做的是:
updateOrderWorkflow,这样它就不会显示未提交的更改。它所做的任何更改都必须在与事务ID相关联的临时空间中进行。updateOrder方法中使用新的提交API端点,在回滚处理程序中使用回滚API。。
https://stackoverflow.com/questions/60901467
复制相似问题