Мои приложения на 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.
Это создает несогласованность данных. Как справиться с этой ситуацией?