2017-02-20 26 views
2

Я сохраняю финансовые транзакции в базе данных. По соображениям эффективности в строке транзакции я сохраняю счет, а также остаток на счете. 0 Например:laravel 5.4: пессимистическая блокировка. Избегайте выбора строки до завершения транзакции

ID | TRANSACTION_AMOUNT | ACCOUNT_BALANCE

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

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

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

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

+0

Вы можете использовать Laravel запланированное задание, чтобы обновить account_balance позже вместо того, чтобы делать оба togther. – sumit

ответ

0

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

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