【问题标题】:Hold row for 4 minutes then delete if no action is taken保留行 4 分钟,如果不采取任何操作,则删除
【发布时间】:2015-09-08 05:33:33
【问题描述】:

我正在使用 php/mysql 构建一个预订系统,我试图弄清楚如何在最终用户输入他们的预订详细信息时保持一行 4 分钟,以避免人们在同时。如果他们离开页面,一旦 4 分钟计时器结束,“持有”该票证的记录将被删除。

我一直在考虑安排一个活动,在他们到达初始页面 4 分钟后运行,但是当他们完成信息页面并完成预订时,应该取消该活动。我在这个问题上进行了很多搜索,只找到了安排未来事件的方法,而不是“保持”记录。

我还认为可能会创建一个唯一的临时值,我可以在 4 分钟结束时查找事件(即名称列中带有 'DELETE4MINS' 的 varchar)。但是,我觉得应该有更好的方法来做到这一点,并且处理保留票的行都没有 varchar 元素。

我有以下表格保存机票预订信息:

CREATE TABLE reservations(
    rid int NOT NULL AUTO_INCREMENT,
    aid int NOT NULL,
    approval tinyint(1) NOT NULL,
    creationTime TIMESTAMP 
        DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (rid),
    CONSTRAINT UQ_RESERVATION_COMPOSITE UNIQUE(rid, approval),
    FOREIGN KEY (aid) REFERENCES accounts (aid)
        ON DELETE CASCADE
);

CREATE TABLE reservedTickets(
    rid int NOT NULL,
    tid int NOT NULL,
    hid int NOT NULL,
    approval tinyint(1) NOT NULL,
    PRIMARY KEY (tid),
    FOREIGN KEY (rid, approval) REFERENCES reservations (rid, approval)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (tid) REFERENCES tickets (tid)
        ON DELETE CASCADE,
    FOREIGN KEY (hid) REFERENCES people (hid)
        ON DELETE CASCADE
);

【问题讨论】:

    标签: php mysql forms


    【解决方案1】:

    我完全看不出有任何实际删除该条目的理由。基本上,您所要做的就是在用户请求时使用当前时间戳在数据库中创建一个预订。成功后,您将向他们展示某种计时器(使用 JS),它将向他们显示剩余时间。当用户提交表单时,您唯一需要做的就是将当前时间与数据库中的时间戳进行比较,并在已经超过 4 分钟的情况下抛出错误。如果出于某种原因,您确实想删除该条目,您可能需要运行每 n 分钟运行一次的 CRON 作业并删除所有“过期”行。或者,在最坏的情况下,您可以在每次有人访问服务时执行该操作(这将成为页面代码的一部分),尽管这是一个坏主意。

    编辑:您可以在显示所有工单的页面上执行删除查询。流程如下:一旦有人访问带有门票列表的页面,所有过期的条目都会被删除,您只向他们展示未预订的门票。这将确保人们只能看到那些可访问但尚未过期的内容

    【讨论】:

    • 我希望尽可能避免 cron 工作。我知道我可以每 5 分钟左右运行一次并删除过期条目。但是,为了我自己的理智,我更愿意将它嵌入到 SQL 中。关注点分离
    • 需要删除该行的原因是前端显示系统中已批准和待处理的工单。如果持有票的行没有被删除,那么在它被清除之前,其他任何人都无法请求该票。通常有 200-300 人同时尝试预订 30-40 张门票,周转时间非常重要。
    • 在这种情况下,每次有人访问页面时执行删除操作是一种方法。不过可能会影响性能。还有其他解决方法,例如运行一个单独的页面,该页面每 4 分钟刷新一次并删除所有行,但情况更糟
    • 幸运的是,我严重过度配置了这台服务器 12GB RAM 和 6 个内核来处理并发访问。性能不应该是一个大问题。但是,这让我回到了最初的问题,即如果在 4 分钟内没有采取任何行动,我该如何安排删除操作。
    • 我真的没有看到任何在客户端这样做的方法。您可以添加一些 JS 代码,将它们重定向到将执行删除操作的页面,但它们可以禁用其 javascript。所以我的猜测是在显示所有票的页面上执行删除查询。流程如下:一旦有人访问带有门票列表的页面,所有过期的条目都会被删除,您只向他们展示未预订的门票。这将确保人们只能看到那些可访问但尚未过期的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    相关资源
    最近更新 更多