Laravel 5.4: пессимистическая блокировка. Избегайте выбора строки до завершения транзакции

Я храню финансовые транзакции в базе данных.
По соображениям эффективности в строке транзакции я сохраняю сумму, а также остаток на счете.
Например:

ID | TRANSACTION_AMOUNT | БАЛАНС

ACCOUNT_BALANCE в новой строке рассчитывается как последний ACCOUNT_BALANCE + новый TRANSACTION_AMOUNT.

Чтобы продолжить эту операцию, мне нужно сделать сначала SELECT, а затем INSERT.
Проблема в том, что две транзакции произошли почти одновременно. Они оба будут читать один и тот же последний ACCOUNT_BALANCE, и после вставки ACCOUNT_BALANCE будет несовместимым.

Я видел функцию lockForUpdate (), но я не совсем уверен, как использовать ее для этого случая или даже если он применяется.

Каков наилучший подход для решения этой проблемы?

2

Решение

Я думаю, что лучший подход заключается в использовании транзакций базы данных. Например

BEGIN WORK;
SELECT account_balance FROM transaction;
-- up the account balance then commit
UPDATE account_balance SET account_balance = new_balance;
COMMIT;

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector