2017-02-20 47 views
2

我將財務交易存儲在數據庫中。 爲了提高交易行的效率,我保存了ammount以及帳戶的餘額。 例如: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;