【问题标题】:Handling race conditions in mysql db在 mysql db 中处理竞争条件
【发布时间】:2018-12-13 12:43:25
【问题描述】:

我正在创建一个可以进行一些信用卡和借记交易的钱包。

数据库架构:

对于每个借记请求,我都会检查借记金额是否小于或等于我钱包中的总金额。总金额将是所有贷方的总和,并将从中减去所有借方的总和。信用可以正常工作,因为我没有在表中保存任何总金额,因此不会发生竞争条件。但在借记时,我需要获取总金额并对其进行一些验证,然后创建一个新的借记条目。

我想到的一个解决方案是为借记设置一个钱包锁,即当一个借记请求到来时,我将锁定它并将其保存在内存中,当另一个借记请求到来时,我将检查锁。

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

请为此提供更好和体面的解决方案。提前致谢。

【问题讨论】:

  • 您目前是否使用 SQL 事务来包装您的查询?显示您当前的代码可能会有所帮助。
  • 是的,所有查询都将在一个事务中。我现在手头没有代码。只是弄清楚可以完成的方法

标签: mysql database database-design locking


【解决方案1】:
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;

确保在每一步都检查错误。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多