代码之家  ›  专栏  ›  技术社区  ›  daniel

客人名单座位计划并发问题

  •  0
  • daniel  · 技术社区  · 3 年前

    如何防止座位在预订系统中被预订两次?

    我正在用PHP和MYSQL作为一个项目为航空旅行制作一个模型预订系统。我有个小问题。 这里的机票和座位信息只有在付款后才能永久存储。 座位号在付款前分配。

    假设人1预订了飞机上的x座位并支付了费用。

    当仍然有人1仍在支付机票费用时,有人2预订了同一个座位(座位尚未预订)并首先完成付款。。

    现在两个人都订了同一个座位。。

    有人能告诉我如何实现临时预订存储吗?该存储可以在预订时用于存储数据,其他用户可以访问该存储来解决此问题,并且用户会话结束后应立即自动删除数据,以防止虚假预订。 请尽快回复。

    0 回复  |  直到 14 年前
        1
  •  3
  •   Colin    15 年前

    一旦用户选择了座位,您就应该记录座位和票证的持有情况,可能是在一个单独的表中,以及该操作发生的时间戳,以及用户的id/会话id。

    当您获得可用座位时,您应该查看您的预订表和临时座位/票务表,以了解我们的可用座位。当用户预订机票时,您可以将永久预订添加到预订表中,然后从临时表中删除该条目。

    您可能希望有一个计划的操作,删除所有存在#分钟的临时条目。

    这样做的最快方法是在内存中缓存临时预订,如memcache或全局对象,但您仍然需要处理线程/同步和竞争条件。

        2
  •  0
  •   zod    15 年前

    当你设计DB时,应该有一个已经预订的标志 如果是肯定的,不可以再次预订。 只需根据数据库字段添加一个检查

    预订的人应该可以取消预订。 也应该有一个日志。 无论如何,用户ID都应该链接到该票证,这样即使在预订之间发生任何事情,用户也可以稍后更新。

    你可以使用 提交回滚 在数据库事务中

        3
  •  0
  •   Bala Chandar    10 年前

    如果我在做,我会在数据库中实现它。

    具有bookedtime字段和status字段。

    当有人选择该注册预订时,将一条记录添加到表中;此记录阻止其他人选择该预订。(插入预订(一些、字段、预订时间、状态)值(“嘎嘎”、“哦”、NOW()、0)

    每当有人表示他们正在预订该时段时(即:每次他们在同一会话中重新加载页面,通过结账过程),都要更新表格。 (UPDATE bookings SET bookedtime=NOW()WHERE somefield='someidentifier';)

    每隔X分钟,用“DELETE FROM bookings WHERE status=0 AND bookedtime<CURRENT_TIME-INTERVAL 15 MINUTE”对数据库进行cron。

    Refer this link