Mysql 防止Nodejs中的并发

Mysql 防止Nodejs中的并发,mysql,node.js,concurrency,Mysql,Node.js,Concurrency,我已经在Nodejs(Express)中建立了一个电子商务后端,假设有一个产品,只剩下1个数量 两个用户试图同时购买该产品,但两个用户都在Mysql数据库的quantity部分得到了该产品的负值 如何摆脱这种情况,建议将是有益的 谢谢你 这可以通过利用特定数据库(mysql)的保证在数据库中实现 postgres/mysql的默认隔离级别允许两次并发读取以查看相同的数据,然后让每一次读取都覆盖另一次读取(在写入时) postgres文档提供了一个: 由于上述规则,更新命令可以 查看不一致的快照:

我已经在Nodejs(Express)中建立了一个电子商务后端,假设有一个产品,只剩下1个数量 两个用户试图同时购买该产品,但两个用户都在Mysql数据库的quantity部分得到了该产品的负值

如何摆脱这种情况,建议将是有益的

谢谢你

这可以通过利用特定数据库(mysql)的保证在数据库中实现

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

postgres文档提供了一个:

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

如果两个此类交易同时试图改变 账户12345,我们显然希望第二笔交易从 帐户行的更新版本。因为每个命令都是 只影响预定的行,让它看到更新的版本 行的不一致性不会产生任何麻烦的不一致性

读取提交模式提供的部分事务隔离是 适用于许多应用程序,此模式快速且易于使用 使用;然而,这并不是对所有情况都足够。应用程序 复杂的查询和更新可能需要更严格的一致性 “读取提交”模式提供的数据库视图


如何在编码级别的NodeJ中防止这种情况,比如在队列中处理请求而不是并行处理threads@user12526605确切地说,这是两种最常见的方法:在内部使用队列或信号量
BEGIN;
UPDATE accounts SET balance = balance + 100.00 WHERE acctnum = 12345;
UPDATE accounts SET balance = balance - 100.00 WHERE acctnum = 7534;
COMMIT;