由于延迟时间和多个请求,避免双DB查询

时间:2012-06-09 16:50:04

标签: php mysql sql task

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

task1 / doTask1.sh / todo

task2 / doTask2.sh / done

task3 / doTask3.sh / todo

task4 / doTask4.sh / todo

等...

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

如果:

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

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


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

2 个答案:

答案 0 :(得分:1)

是的,这可能发生。

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

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

答案 1 :(得分:0)

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