如何防止在预订系统中预订座位两次?
我正在为PHP和MYSQL中的航空旅行制作模型预订系统作为项目。我有一个小问题。 此处的票务和座位详细信息仅在付款后永久存储。 座位号在付款前分配。
假设第1人在一架飞机上预定x并支付费用。
虽然仍然是第1人仍在支付机票,但是第2人预订同一座位(座位尚未预订)并先完成付款..
现在两个人都会预订同一个座位..
有人可以告诉我如何实施临时预订存储,可以在预订时用于存储数据,并且其他用户可以访问以解决此问题,并且一旦用户的会话结束,数据就会自动删除防止虚假预订。 请尽快给出答复。
答案 0 :(得分:2)
一旦用户选择了一个座位,您应该记录一个座位和票据被保留,可能在一个单独的表中,以及该动作发生的时间戳,以及用户的ID /会话ID。 / p>
当您获得可用座位时,您应该检查您的预订表和临时座位/票表以确定我们可以使用的座位。当用户预订机票时,您可以将永久预订添加到预订表中,然后从临时表中删除该条目。
您可能希望进行一项计划操作,删除所有临时条目,这些条目是旧的分钟数。
执行此类操作的最快方法是拥有临时预订的内存缓存,例如memcache或全局对象,但是您仍然需要处理线程/同步和竞争条件。
答案 1 :(得分:0)
当您设计数据库时,应该有一个已经预订的标志 如果是,则不能再次预订。 只需添加基于该db字段的检查
设置预订的人应该可以取消预订。 还应该有一个日志。 无论如何,用户ID应链接到该票证,以便即使在预订之间发生任何事情,用户也可以稍后更新。您可以在数据库事务中使用提交回滚
答案 2 :(得分:0)
如果我这样做,我会在数据库中实现它。
有预订时间字段和状态字段。
当有人选择该注册预订时,请在表格中添加记录;此记录可防止其他人选择该预订。 (插入预订(部分,字段,预订时间,状态)价值('嘎嘎',' moo',NOW(),0))
每当有人表示他们正在预订该位置时(IE:每次他们在同一会话中重新加载页面,在结账过程中移动),请更新表格。 (UPDATE预订SET预订时间= NOW()WHERE somefield =' someidentifier&#39 ;;)
每隔X分钟,cron数据库使用" DELETE FROM预订WHERE status = 0 AND bookedtime< CURRENT_TIME - 间隔15分钟"。