【问题标题】:How to handle data inconsistency如何处理数据不一致
【发布时间】: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


【解决方案1】:

听起来问题在于第 2 步中的 updateOrderWorkflow 在提交之前公开了 PROCESS_1 的事务所做的更改。

我会做的是:

  • 在步骤 2 中更改 updateOrderWorkflow,使其不显示未提交的更改。它所做的任何更改都必须在与交易 ID 相关联的某种临时空间中进行。
  • 将 API 端点添加到同一 API,以提交或回滚事务的更改。如果提交,临时空间中的更改将全局可见。如果回滚,更改将被丢弃。
  • 在您的 updateOrder 方法中使用新的提交 API 端点,并在您的回滚处理程序中使用回滚 API。

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    相关资源
    最近更新 更多