gpt4 book ai didi

node.js - 我应该如何保证涉及金融交易操作的数据库的一致性

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:45 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何处理数据库中的一致性。在场景中:

  • 用户 A 在数据库中有一个会计凭证,其中包含一个余额字段,表示他当前的金额。 (假设最初他有 100 美元)

  • 我的系统有很多方法可以向他的账户收费。

  • 假设 2 个方法同时发生,每个方法向他收取 10 美元,这些步骤按以下顺序同时发生:
    • 方法 1 读取他的余额并存储在内存中 (100$)
    • 方法 2 读取他的余额并存储在内存中(100 美元)...一些业务逻辑
    • 方法 1 通过将内存中的变量减去 10 (100$ - 10$) 更新他的余额,然后保存
    • 方法 2 通过将内存中的变量减去 10 (100$ - 10$) 更新他的余额,然后保存

这意味着他只被收取了 10 美元而不是 20 美元。

这个情况我查了好久没弄清楚(对不起我的愚蠢)。真的很感谢你帮助启发我的头脑。 :)

最佳答案

您刚刚发现了为什么金融交易很复杂 :-)

您有没有想过为什么要花一些时间才能更新您的银行账户余额?或者为什么您实际上有两个余额,而不是一个?

那是因为您的帐户实际上可能会出现负数,并且(在一定程度上)没问题。

所以在现实生活中发生的情况是您有 100 美元的余额,您支付 10 美元,直到该交易被处理并由接收方确认,您仍然有 100 美元。如果您进行 20 笔交易,每笔 10 美元,您将能够完成它们,因为系统很可能不会注意到。老实说,它不应该。想想信用卡,您现在可能没有足够的钱,但也许您知道信用卡到期时您会有足够的钱。

因此,您描述的竞争条件只有在您实际读取值然后更新它时才有效。

有几种方法:

  • 读取当前余额,并使用旧余额作为 where 语句中的字段更新行。这样,如果它不更新任何行,您就知道需要重新读取和更新。
  • 不要更新余额,只根据时间更新,比如说每小时一次。是的,您可能仍需要进行一些检查,但系统总体上会更加灵敏。
  • 第一步是锁定数据库行。这可行,但有可能会使应用变慢。

关于node.js - 我应该如何保证涉及金融交易操作的数据库的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com