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

mtb9vblg  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(338)

我正在创建一个钱包,将有一些信用和借记交易。
数据库架构:

在每次借记请求中,我都会检查借记金额是否小于或等于我钱包中的总金额。总金额将是所有贷方的总和,并从中减去所有借方的总和。信用卡将工作良好,因为我没有在表中保存任何总额,因此没有比赛条件将发生。但在借记时,我需要得到总金额,并对其进行一些验证,然后创建一个新的借记条目。
我想到的一个解决方案是为借记设置一个钱包锁,即当一个借记请求到来时,我会为它取一个锁,并将其保存在内存中,当另一个借记请求到来时,我会检查锁。
有没有更好的解决办法。我想到的另一个解决方案是表行锁,但我不确定是否可以将其用于我的案例。
请帮我找到一个更好更体面的解决办法。提前谢谢。

kiz8lqtg

kiz8lqtg1#

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;

一定要检查每一步的错误。

相关问题