处理mysql数据库中的竞争条件

时间:2018-12-13 12:43:25

标签: mysql database database-design locking

我正在创建一个钱包,该钱包将进行一些贷记和借记交易。

数据库架构:

enter image description here

对于每个借记请求,我都会检查借记金额是否小于或等于我钱包中的总金额。总金额将是所有贷项的总和,并从中减去所有借方的总和。由于我没有在表中保存任何总金额,因此积分可以正常使用,因此不会发生比赛情况。但是在借记时,我需要获取总金额并进行一些验证,然后创建一个新的借项。

我想到的一个解决方案是为借记卡设置一个钱包锁,即,当借记请求到来时,我会对其进行锁定,以将其保存在内存中;当另一个借记请求到来时,我将检查该锁。

有没有更好的解决方案呢?我想到的另一个解决方案是表行锁定,但是我不确定是否可以在我的情况下使用它。

请为我提供更好,更体面的解决方案。预先感谢。

1 个答案:

答案 0 :(得分:0)

BEGIN;
a bunch of UPDATEs to subtract money from one place and add it to another.
if overdrawn, ROLLBACK
else COMMIT

您可能需要更多帮助避免死锁:

BEGIN;
SELECT ... FOR UPDATE;  -- the rows you need to look at and may need to update
... (tests)
UPDATE ... -- subtract money from here
UPDATE ... -- add that money to there
COMMIT;

请务必在每个步骤中检查错误。