在线酒店预订系统,同时预订?

6

我被要求创建一个带有在线支付的在线预订系统,但如果两个客户在同一时间预订了相同的房间怎么办,这让我很困惑。

例如:
同时:

客户1和客户2预订了一间标准房间,但只有1间房间可用。(房间可用性将显示仍有1间可用。)然后他们同时点击“确认”按钮。


在屏幕底部放置一个警告,提示预订直到确认后才算最终,并向稍微慢了一点的用户发送错误消息——他们并不是在“确认”时完全同时操作,因此其中一个请求将首先更新您的数据库,而另一个请求应该会导致适当的错误消息。 - nnnnnn
2
@nnnnnn:...直到出现意外情况,两个请求同时运行(在两个单独的线程中)。这种情况需要锁定或事务来保证可靠性。 - Matti Virkkunen
@Matti - 抱歉,我的意思是数据库更新将作为并发控制机制,假设底层数据库即使同时处理http请求,也不会允许两个线程同时更新同一条记录。 - nnnnnn
@Matti先生和nnnnnn先生:我还是新手,所以我会研究锁和线程。谢谢。 - KiiroSora09
@Matti - 当然,始终要在开始之前考虑并发。但是,如果您的更新仅应用于记录的时间戳与您先前读取它时相同时,则不一定需要锁定记录。两种方法都可以。 - nnnnnn
显示剩余4条评论
3个回答

6
使用锁定构造(在这种情况下可能是在数据库级别上)来确保一次只能进行一个确认。如果可能出现类似这样的竞争条件,则应始终执行此操作。这样,您将始终知道谁是第一个,并且您可以告诉其他用户他们确认过慢。
另外一个需要添加的建议是设定付款时间限制。在许多系统中,当您确认预订时,您会有一定的时间来支付以获得房间的预留权。如果在该时间内没有付款,则确认将过期,房间将再次变得可用。

谢谢您先生…我会尝试在我的系统中实现它们,希望我可以用我的当前web开发技能做到这一点。我想也许我可以制作一张表格来记录未付款的预订… - KiiroSora09
@KiiroSora09:要么这样,要么你可以在预订表中使用一个字段来标记预订为“待定”。这样你就不必创建两个几乎包含相同信息的表了。 - Matti Virkkunen

0
使用“临时”系统,将预订标记为临时状态,保持10分钟。这些时间段随后变得不可用于后续请求。如果在时间范围内未完成预订,则该时间段将再次释放。如果您在客户预订时间段之前获取所有客户详细信息,则退出率应保持较低。
您必须向预订者传达时间范围及其“临时状态”。如果您有后续阶段,访问者可能会停止,那么一个简单的JS计时器倒计时将有所帮助,并推动预订者完成整个过程。
或者,允许双重预订,直到最终的“支付”按钮被按下,此时将按先来先服务的原则进行处理。第二种方法的转化率更高,而第一种方法则更加“正确”。

0

有几种方法可以解决这个问题。

  1. 如果用户选择了一个房间,请在网页前端暂时将其作为不可用删除。然后,任何后续访问者都无法选择该房间进行预订。如果第一个用户没有完成交易,则该房间再次变为可用。
  2. 如上所述,在数据库上放置锁定,以便一次只能写入一个记录

Sir Martin,感谢您的回答。我会查阅如何在数据库上设置锁定的方法。 - KiiroSora09
我喜欢向那些比我拥有更多知识的人表达尊敬,特别是当他们试图帮助时。* 我很钦佩程序员:D - KiiroSora09

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接