【问题标题】:MySQL - automatically update row after x seconds of inactivity (set expiration time)MySQL - 在 x 秒不活动后自动更新行(设置过期时间)
【发布时间】:2017-04-05 18:09:04
【问题描述】:

对于一个艺术项目,我正在尝试建立一个订购网站。 该概念允许用户最多预订。每个艺术家的两个时间段。每个艺术家有 12 个插槽,但每个插槽都有特定的定义(因此每个插槽都是唯一的)。这些插槽仅在非常有限的时间内可用,希望能快速预订。所以短时间内会有很多请求。我必须确保每篇文章/广告位一次只提供给一个用户,并且不能重复预订。

我的想法是,检查下一个未预订的插槽 (status="free) 并根据该请求将表中相应行的状态更新为 status="locked"。如果用户继续执行实际操作预订插槽,状态更新为“已预订”。

如果用户点击“取消”,我可以通过将行更新为 status="free" 来发布文章。

但是,用户放弃该网站的可能性不大,我看不出有什么方法可以检查。该插槽将保持“锁定”状态。我在想,可能有一种方法可以自动重置状态,例如120 秒后被“锁定”并向用户显示倒计时。这甚至可以增强兴奋因素。

我认为 cron 作业不会起作用,因为我需要将锚点作为行的最后更新,而不是特定的日期时间。

我查看了 MySQL 事件,但了解到我无法操作它所附加的表的数据。

我将不胜感激任何想法。 谢谢, 山姆

【问题讨论】:

    标签: php mysql cron mysql-event


    【解决方案1】:
    1. 在您的数据库中,您的状态表添加一个datetime 字段。

    2. 当有人锁定slot 时,您还可以使用NOW() 保存当前时间

    3. 当有人查询您执行的插槽并更新和释放非活动插槽时

      Update slots
      SET locked = false 
      WHERE `datetime`> NOW() - INTERVAL 15 MINUTE;
      
      SELECT *
      FROM slots
      WHERE locked = false;
      

    【讨论】:

    • 哇。那很快。我是否理解正确,“间隔 15 分钟”是我可以根据需要更改的设置?你能解释一下“当有人咨询插槽时”是什么意思吗?谢谢!
    • 可能还需要过滤特定的 id 或其他东西。
    • 是的,15 minutes 可以是 1 hour 检查HERE 以获取所有选项。
    • 我的猜测是你去 db 并检查可用的插槽来显示用户?因此,在检查哪些插槽是空闲的之前,您需要更新表格以解锁非活动插槽。
    • 基本上,您所说的是在任何用户发送新请求后立即更新所有行的状态。那讲得通。我没想到这是一个“清理”触发器。很酷。我会试试这个!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2014-07-30
    相关资源
    最近更新 更多