mysql - 在 Nodejs 中防止并发
问题描述
我在Nodejs(Express)中建立了一个电子商务后端,假设有一个产品,只剩下1个数量,两个用户同时尝试购买该产品,两个用户都在我的数量部分得到该产品留下负值mysql数据库
如何摆脱这个,建议会有所帮助
谢谢
解决方案
这可以通过利用特定数据库(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 模式提供的更严格一致的数据库视图。
推荐阅读
- java - 不知道这个方法是做什么的
- reactjs - 我如何移动到与 abc/anything 匹配的任何特定路线
- sql - 如何从 MariaDB 列的所有值中修剪所有前导和尾随空格
- svn - 声纳扫描仪抛出 EOFException - 无法读取 HTTP 状态行
- c# - 如何从 Winforms 应用程序启动 WPF 应用程序
- lotus-domino - 安装 Lotus Notes 服务器
- php - 如何将登录用户的个人资料图片添加到我的 wordpress 网站上的 wordpress 顶部栏/菜单栏?
- swift - 尽管 URL 正确,AVPlayer 仍无法播放
- apache-kafka - Kafka Streams 代理连接超时设置
- python - OpenCV:无法加载图像