为了账号安全,请及时绑定邮箱和手机立即绑定

如果两个或多个请求同时出现会发生什么?

如果两个或多个请求同时出现会发生什么?

至尊宝的传说 2023-09-11 16:22:25
我是独立开发者和自由职业者,我在我的城市有一个简单的本地电子商务项目。我用 PHP MySQL 和其他前端技术开发了所有代码。但我想如果只剩下一件商品并且两个或更多人同时订购同一商品会发生什么。我使用了算法,如果商品缺货,则订单将被取消或要求客户取消项目,以便哪个客户将不得不取消他的项目或哪个客户应该下订单。我知道这个问题看起来很愚蠢,但是,想想其他场景中的其他项目,如果我制作随机聊天 Web 应用程序,状态将如何影响。如果一个人在线并且没有与任何人聊天,如何匹配帐户。我为此尝试过一些方法,但没有成功。我有 3 台电脑,其中 2 台 PC 和一台 Mac,我尝试同时发出请求,但由于互联网速度的原因,只有一台可以下订单,而另一台则在 2 分钟后收到故障消息。那么如果速度相同会发生什么呢?我是否需要添加任何类型的算法来下订单,然后其他人保留该订单。我正在谷歌搜索但什么也没找到。正如我之前所说,我是一名独立开发人员,因此没有人询问要做什么,或者 MySql 会处理它。哦,如果你想用 WordPress 或像 laravel 这样的框架来做这样的项目。我也同意你的观点,但客户说只使用简单的编程语言,甚至不使用库。
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您所描述的是一种race condition情况,您处理它的方式取决于业务逻辑。例如,对于缺货的产品,您首先需要决定是要自动延期交货还是要中止购买。

如果您想中止购买,您需要使用某种类型的数据库locking机制。锁定可以暂时阻止对数据库表或记录的访问。这个想法是,您在履行过程开始时锁定库存信息,并仅在处理购买后才解锁。

当数据库请求遇到锁时,它将等待直到锁被释放才能继续操作(或者直到发生超时)。所以最先获得锁的请求,就是第一个有机会完成购买的请求。

但单独锁定可能还不够,要防止您想要在database transaction. 事务可以确保处理购买所需的所有操作成功发生,否则一切都会回滚。例如,使用交易可能会阻止您在未实际完成购买的情况下更新库存数量。

目标是当两个请求几乎同时到来时(因为没有同时发生任何事情),其中一个请求将首先获得锁定,然后完成commit购买交易。当第二个请求最终有机会被处理时,库存将为零,交易将失败并发生roll-back(假设您实施了适当的检查)。

您需要的具体查询和检查因应用程序而异,但适用相同的概念。对于您的情况,我们没有任何具体信息可以进一步指导您,因此我建议您检查提供的链接以收集更多信息。

祝你好运!


查看完整回答
反对 回复 2023-09-11
?
墨色风雨

TA贡献1853条经验 获得超6个赞

有一个计数器来跟踪数据库中剩余项目的数量。下订单时,在更新可用商品计数之前对表应用写锁。这是两个请求无法同时更新表。


查看完整回答
反对 回复 2023-09-11
  • 2 回答
  • 0 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信