【发布时间】:2020-04-06 04:22:28
【问题描述】:
我在 Nodejs(Express) 中建立了一个电子商务后端,假设有一个产品,只剩下 1 个数量 并且两个用户同时尝试购买该产品,他们都得到了该产品,在我的 Mysql Db 的数量部分中留下了负值
如何摆脱这个,建议会有帮助
谢谢
【问题讨论】:
标签: mysql node.js concurrency
我在 Nodejs(Express) 中建立了一个电子商务后端,假设有一个产品,只剩下 1 个数量 并且两个用户同时尝试购买该产品,他们都得到了该产品,在我的 Mysql Db 的数量部分中留下了负值
如何摆脱这个,建议会有帮助
谢谢
【问题讨论】:
标签: mysql node.js concurrency
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 模式提供的部分事务隔离是 适合许多应用程序,并且此模式快速且简单 采用;但是,它并不适用于所有情况。应用程序 复杂的查询和更新可能需要更严格的一致性 比已提交读模式提供的数据库视图。
【讨论】: