【问题标题】:prevent race condition in online hotel booking防止在线酒店预订中的竞争条件
【发布时间】:2015-12-24 06:37:30
【问题描述】:

我之前问过这个问题,人们给了我解决问题的方法,但现在我的问题发生了变化。在我的数据库中有一个名为 rooms 的表之前。它有一个hold 字段,当有人进行预订时,我会在未来 15 分钟内为该用户保留它。如果该用户未在 15 分钟内完成预订,则该房间将再次可用。这是我之前问题的解决方案。

但现在我不再有客房桌了。我只有房间类型和预订表。 Roomtype 得到了房间的名称价格信息,当然还有 id 字段。预订表有 checkin checkout roomtypeid 和有关用户的信息。由于我没有房间表,所以我无法找到一种方法来阻止多个用户同时预订一个房间。

我的问题是如何防止没有房间表的比赛条件?如果问的不是太多,我希望解决方案只有 sql 和 php。 Here is a link to my previous question

编辑:我找到了这篇文章,这就是我不再有房间表的原因。 link

【问题讨论】:

  • 听起来您可以在您的预订表中添加一个初步预订,并在 15 分钟后过期。
  • 房间桌似乎是一张重要的桌子,可以将所有东西放在一起;为什么要删除它?
  • @Jack 我删除了它,因为我不再需要它。我还找到了一种更好的方法来跟踪有多少房间可用,有多少房间没有。
  • @JoachimIsaksson 在我不断更新保持字段之前我这样做的方式。所以我不必插入或删除任何东西。我刚刚检查了该字段,如果它可用,我会更新它。我想知道是否可以找到类似的解决方案,这样我就不必编写定期从数据库中删除条目的东西。在我的另一篇文章中,有人建议我使用 cronjob,但我不知道那是什么。
  • 当你使用事务表时会被锁定。

标签: php mysql race-condition


【解决方案1】:

您可以将临时预留添加到预留表(带有临时标志/字段),如果预留在 15 分钟后未完成,则稍后将其删除。

此外,如果多个用户尝试同时预订最后一个房间,您应该在预订的每个步骤中再次检查可用性,以通知用户最后一个房间刚刚被占用并建议另一个房间类型等。

【讨论】:

  • 谢谢。经过深思熟虑,我最终添加了 2 个字段。一个是检查预订是否已付款,另一个是检查是否有人正在预订房间。我在上一个问题中的担忧是,如果有人在预订过程中离开了怎么办。感谢您和像您这样的人帮助其他人并回答他们关于 SO 的问题,这一切都得到了解决和解决。
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多