Как справиться с несоответствием данных - PullRequest
1 голос
/ 28 марта 2020

Мои приложения на Spring MVC 4.2 с базой данных postgres. В моем приложении мы используем 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 () и обновляет STEP-2. Теперь PROCESS_1 завершается с ошибкой в ​​STEP-3 и вызывает метод компенсации / отката, но PROCESS_2 успешно завершает STEP-3.

Это создает несогласованность данных. Как справиться с этой ситуацией?

1 Ответ

1 голос
/ 28 марта 2020

Похоже, проблема в том, что updateOrderWorkflow на шаге 2 раскрывает изменения, внесенные транзакцией PROCESS_1 до ее совершения.

Я бы сделал следующее:

  • Измените updateOrderWorkflow на шаге 2, чтобы не показывать незафиксированные изменения. Любые изменения, которые он делает, должны быть сделаны во временном пространстве некоторого вида, связанном с идентификатором транзакции.
  • Добавьте конечную точку API к тому же API, чтобы зафиксировать или откатить изменения транзакции. Если зафиксировано, изменения во временном пространстве становятся видимыми глобально. В случае отката изменения отменяются.
  • Используйте новую конечную точку API фиксации в методе updateOrder и API отката в обработчике отката.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...