laravel 5.4:悲观锁定。在交易完成之前避免选择一行

时间:2017-02-20 00:27:28

标签: php mysql laravel-5 transactions locking

我正在将金融交易存储在数据库中。 出于效率原因,在事务行中我保存了ammount以及帐户的余额。 例如:

ID | TRANSACTION_AMOUNT | ACCOUNT_BALANCE

新行中的ACCOUNT_BALANCE计算为最后一次ACCOUNT_BALANCE +新的TRANSACTION_AMOUNT。

要继续此操作,我需要先执行SELECT,然后执行INSERT。 问题是两个交易几乎同时发生。它们都将读取相同的最后一个ACCOUNT_BALANCE,并且在插入后ACCOUNT_BALANCE不一致。

我已经看过函数lockForUpdate()但是我不完全确定如何在这种情况下使用它,或者即使应用它。

解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是使用数据库事务。例如

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