【发布时间】:2019-10-08 11:28:29
【问题描述】:
我试图弄清楚如何处理数据库中的一致性。 在场景中:
用户 A 在数据库中有一个会计凭证,其中包含一个余额字段,表示他当前的金额。 (假设最初他有 100 美元)
我的系统有很多方法可以从他的账户中扣款。
- 假设同时发生 2 个方法,每个方法向他收取 10 美元的费用,这些步骤按以下顺序同时发生:
- 方法1读取他的余额并存储在内存中(100美元)
- 方法 2 读取他的余额并存储在内存中 (100$) ...一些业务逻辑
- 方法 1 通过将内存中的变量减去 10 (100$ - 10$) 来更新余额,然后保存
- 方法 2 通过将内存中的变量减去 10 (100$ - 10$) 来更新余额,然后保存
这意味着他只被收取了 10 美元而不是 20 美元。
我搜索了一段时间,无法弄清楚(对不起我的愚蠢)。 真的很感谢你的帮助启发了我的小聪明。 :)
【问题讨论】:
-
在我看来,问题主要源于业务层中应该在数据库级别完成的事情。与其记住原来的 100,减去 10,然后将 90 写入数据库,不如让 DBMS 减去 10:
update account set balance = balance - 10 where account_id = 123;。 -
另一种选择是锁定帐户。如果您的进程可以锁定帐户,则继续,否则等待。所以只有一个进程看到原始的 100 并将其减少到 90,然后解锁帐户。另一个进程将看到 90 而不是 100,因为它必须等到该进程再次解锁。
标签: node.js database mongodb algorithm backend