Я храню финансовые транзакции в базе данных.
По соображениям эффективности в строке транзакции я сохраняю сумму, а также остаток на счете.
Например:
ID | TRANSACTION_AMOUNT | БАЛАНС
ACCOUNT_BALANCE в новой строке рассчитывается как последний ACCOUNT_BALANCE + новый TRANSACTION_AMOUNT.
Чтобы продолжить эту операцию, мне нужно сделать сначала SELECT, а затем INSERT.
Проблема в том, что две транзакции произошли почти одновременно. Они оба будут читать один и тот же последний ACCOUNT_BALANCE, и после вставки ACCOUNT_BALANCE будет несовместимым.
Я видел функцию lockForUpdate (), но я не совсем уверен, как использовать ее для этого случая или даже если он применяется.
Каков наилучший подход для решения этой проблемы?
Я думаю, что лучший подход заключается в использовании транзакций базы данных. Например
BEGIN WORK;
SELECT account_balance FROM transaction;
-- up the account balance then commit
UPDATE account_balance SET account_balance = new_balance;
COMMIT;
Других решений пока нет …