酒店预订系统中处理多个预订并发的预订流程的最佳实践是什么?

问题描述 投票:0回答:1

对于我的大学项目,我正在使用 Java 以及 Spring 框架和 MySQL 数据库开发一个酒店预订应用程序。

数据库详细信息:

  • 我有一个存储预订详细信息的实体类型

预订

预订 ID 签到 退房 ..所有其他细节
  • 当用户想要预订房间时,我使用此表以事务方式在数据库中检查所有房间是否可用,如果是,则预订它们并在表中添加新实体。

我需要知道预订流程应该如何运作。

我想到了两种情况:

第一个场景:用户选择他想要预订的房间 - >结帐并输入他的信用卡号码 - >在数据库中进行交易检查。如果没有房间,我会告诉用户房间没有,否则我会继续付款。

我的问题是让用户输入他的信用卡然后告诉他抱歉房间不可用,这正常吗?

第二种情况:

  • 我将添加另一个名为临时预订的实体类型,该实体类型将预订 ID 作为外键,并引用过期日期属性

暂时预约

reservation-id(外键) 到期日

用户选择他想要预订的房间 -> 数据库中发生事务检查。如果所有房间都有空房,则在“临时预订”和“预订”表中预订它们 -> 让用户输入他的信用卡号 -> 如果付款成功,则从“临时预订”表中删除预订,否则如果发生任何错误付款期间,从两个表中删除预订。 问题是当用户在确认付款之前没有输入他的信用卡或关闭应用程序时。因此,我将使用“临时预订”表和定期运行的计划函数来从两个表中删除所有过期的未确认预订。

我知道这个解决方案可能不切实际,所以我想知道这个问题实际上是如何解决的。

java mysql concurrency race-condition spring-transactions
1个回答
0
投票

如果您以现实世界的实际方式思考,您的第一种方法不是很好,从用户体验设计的角度来看,它非常糟糕,因为您让用户完成所有艰苦的工作,然后您说房间不可用用户体验不是很好。

您应在付款前先获取房间和入住/退房详细信息,并检查当天和该时间是否有空房。如果您已应用以下逻辑并继续获取付款详细信息。

解决这个问题的一种方法是,当有人正在进行交易时,你在特定日期和入住/退房时间的房间上锁,并保持该锁大约 10 分钟,这个时间足够用户进行付款交易和预订房间,否则从数据库表中删除锁并让其他人预订房间。

通过这种方式,您可以通过在交易进行一段指定时间内应用临时锁定来解决预订问题,如果交易完成,您就可以预订房间。如果交易失败,请解除临时锁。

© www.soinside.com 2019 - 2024. All rights reserved.