避免由于延迟时间和多个请求而导致的重复数据库查询


Avoid double DB querying due to latency times and multiple requests

我有一个链接到我的网站的MySql数据库,其中有一个带有任务列表的表格(列在下面用"/"分隔),即:

任务1/doTask1.sh/待办事项

任务2/doTask2.sh/完成

任务3/doTask3.sh/待办事项

任务4/doTask4.sh/待办事项

等。。。

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

如果:

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

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


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

是的,这可能会发生。

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

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

锁定列表。获取仍在待办的请求任务,将它们标记为"正在进行",解锁,然后将它们传递给执行任务的任何任务。