【问题标题】:Avoid double DB querying due to latency times and multiple requests由于延迟时间和多个请求,避免双重数据库查询
【发布时间】:2012-06-13 08:02:10
【问题描述】:

我有一个链接到我的网站的 MySql 数据库,它有一个带有任务列表的表(列由下面的“/”分隔),即:

task1 / doTask1.sh / todo

task2 / doTask2.sh / 完成

task3 / doTask3.sh / todo

task4 / doTask4.sh / todo

等等……

对我的网站的每个请求,我都希望执行“待办事项”任务,然后由服务器将其标记为“完成”。任务只能执行一次。但是问题来了。

如果:

用户 A 选择标记为“待办事项”的任务。 doTask1.sh 执行并标记为完成,由用户 A 的请求触发。 用户 B 选择标记为“待办事项”的任务(仅任务 3 和任务 3,因为任务 1 已完成)。 doTask3.sh 执行并标记为完成,由用户 A 的请求触发。 doTask3.sh 再次执行,由用户 B 的请求触发。 doTask4.sh 也一样。

由于同时存在数据库连接,使用 PHP/Nginx/MySql 会发生这种情况吗?如果是,如何绕过/避免这个问题?


在这个例子中,我使用 doTaskx.sh 来简化情况。实际上,此列将包含对任务的描述,为我的网站提供支持的 PHP 脚本将根据该描述执行任务。

【问题讨论】:

    标签: php mysql sql task


    【解决方案1】:

    锁定列表。 获取仍待执行的请求任务,将它们标记为“进行中”,解锁,然后将它们传递给执行任务的任何对象。

    【讨论】:

      【解决方案2】:

      是的,这可能发生。

      解决此问题的一种方法是执行以下操作:

      • 创建“待定”状态。
      • 当收到执行任务的请求时,对数据库运行更新,将匹配 ID 和状态 =“todo”的所有内容设置为“待处理”。
      • 如果更新的记录数为 1,则执行任务并将其标记为“完成”。
      • 如果更新的记录数为 0,则表示另一个请求先到达。
      • 无论哪种方式,更新用户界面以显示任务处于挂起/完成状态。

      【讨论】:

        猜你喜欢
        • 2018-10-06
        • 2018-01-02
        • 1970-01-01
        • 2021-03-16
        • 2021-12-18
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多