【问题标题】:Prevent Concurrency In Nodejs在 Nodejs 中防止并发
【发布时间】:2020-04-06 04:22:28
【问题描述】:

我在 Nodejs(Express) 中建立了一个电子商务后端,假设有一个产品,只剩下 1 个数量 并且两个用户同时尝试购买该产品,他们都得到了该产品,在我的 Mysql Db 的数量部分中留下了负值

如何摆脱这个,建议会有帮助

谢谢

【问题讨论】:

    标签: mysql node.js concurrency


    【解决方案1】:

    Database Transaction Isolation Levels

    这可以通过利用来自特定数据库 (mysql) 的保证在您的数据库中完成。

    postgres/mysql 的默认隔离级别允许 2 次并发读取以查看相同的数据,然后让每个读取覆盖另一个(在写入时)。

    postgres 文档提供了一个excellent example of this case

    由于上述规则,更新命令可以 查看不一致的快照:可以看到并发的效果 在尝试更新的同一行上更新命令,但确实如此 看不到这些命令对数据库中其他行的影响。这 行为使读取提交模式不适用于以下命令 涉及复杂的搜索条件;但是,它正好适合 更简单的情况。例如,考虑更新银行余额 像这样的交易:

    BEGIN;
    UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
    UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
    COMMIT;
    

    如果两个这样的交易同时尝试改变余额 账户 12345,我们显然希望第二笔交易开始 帐户行的更新版本。因为每个命令都是 只影响预定的行,让它看到更新的版本 的行不会造成任何麻烦的不一致。

    ...

    Read Committed 模式提供的部分事务隔离是 适合许多应用程序,并且此模式快速且简单 采用;但是,它并不适用于所有情况。应用程序 复杂的查询和更新可能需要更严格的一致性 比已提交读模式提供的数据库视图。

    【讨论】:

    • 如何在编码级别的nodejs中防止这种情况,比如在队列中处理请求而不是并行线程
    • @user12526605 确切地说,这是两种最常见的方式:内部使用队列或信号量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2019-04-20
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多