在电影院里,我去那里有售票亭,您可以选择想要的座位。他们也有一个相同的网站(该网站还有一个倒计时计时器,例如30秒,您必须在其中选择座位)。
虽然我了解诸如数据库事务之类的知识以及处理多个同时用户的其他技术,但我还是无法理解如何允许多个人同时选择一个席位;是否像第一个按“购买”的人那样简单,然后另一个人将收到错误消息,还是我错过了什么?
在电影院里,我去那里有售票亭,您可以选择想要的座位。他们也有一个相同的网站(该网站还有一个倒计时计时器,例如30秒,您必须在其中选择座位)。
虽然我了解诸如数据库事务之类的知识以及处理多个同时用户的其他技术,但我还是无法理解如何允许多个人同时选择一个席位;是否像第一个按“购买”的人那样简单,然后另一个人将收到错误消息,还是我错过了什么?
Answers:
执行此操作的经典方法是使用事务数据库(因此不会发生冲突),并临时分配给您一个席位,该席位会在一定时间(例如信息亭的10分钟)后失效,从而给您足够的时间工资。如果(客户可见的)交易失败或超时,则可以将席位分配释放回池中。(所有状态更改都通过事务数据库进行处理,并且一个客户可见的事务可能需要许多数据库级事务。)
航空公司将使用类似的系统(尽管由于需要处理多个航程,所以会更加复杂!)在线预订座位。我想超时会更长一些;机票通常比电影票预订得更早,而且价格也更高。
如今,您所看到的30秒通常更像是15分钟。我认为在此期间没有活动的数据库事务。
如果我要设计这样的系统,那么我将这样做:拥有业务对象Booking
和Reservation
。预订基本上是确认(即付费)的预订。我会将它们存储在同一数据库表中,并按一个或两个属性进行区分。
在获取可用座位时,您将同时查询预订和预订。
当有人选择座位时,您将创建一个新的预订,从而向其他顾客显示该座位。同一席位的第二次预订将被拒绝-数据库更新或插入将失败。如果客户确认/支付了预订,则将其转换为预订。在定期批处理作业中,您删除所有15分钟(或您给客户的时间)之前的预订。
它带有数据库ACID属性-隔离。数据库对数据使用锁,以避免并发修改数据。
http://en.wikipedia.org/wiki/Isolation_%28database_systems%29
这里至少涉及两个业务流程。
显示可用的座位。
预订选定的座位。
由于这些过程不会彼此紧随,并且由于两个人可以选择同一席位,因此出现了并发问题。
如果您的数据库设计分配了正确的唯一性约束,那么以下各项的组合:
-剧院ID
-SeatID
-EventID
是唯一的,那么数据库将防止重复。
以下情况也是可能的,但上述建议的实现将解决以下情况:
假设可以显示给定剧院和给定事件可用的网格视图:
因此,您所需要做的只是正确的数据库设计和对约束的正确选择。
如果需要,可以使用事务队列来使用其他更复杂的方法。在这种情况下,请求首先被写入队列,然后每n秒触发一个进程,但这在您的情况下几乎没有必要或不实际。
真正有趣的部分是用户1的列表网格应显示什么?