首页 > 解决方案 > 在 Nodejs 中防止并发

问题描述

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

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

谢谢

标签: mysqlnode.jsconcurrency

解决方案


数据库事务隔离级别

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

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

postgres 文档提供了一个很好的例子

由于上述规则,更新命令可能会看到不一致的快照:它可以看到并发更新命令对其尝试更新的同一行的影响,但看不到这些命令对其他行的影响在数据库中。这种行为使得 Read Committed 模式不适用于涉及复杂搜索条件的命令;但是,它适用于更简单的情况。例如,考虑使用以下交易更新银行余额:

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 模式提供的部分事务隔离对于很多应用来说已经足够了,而且这种模式使用起来又快又简单;但是,它并不适用于所有情况。执行复杂查询和更新的应用程序可能需要比 Read Committed 模式提供的更严格一致的数据库视图。


推荐阅读