如何确保sql表没有锁定/停止并发crons

时间:2013-03-20 17:26:28

标签: php mysql cron cron-task

我每隔几分钟运行一个cron作业,通过“待办事项”列表中的前50个项目运行,在每个项目上运行脚本并将其标记为在数据库中运行。

这样做很好,直到标记完整项目的表被某些东西锁定并且项目没有被标记掉。然后cron再次跑了,经历了相同的50个项目。

重复并重复这一过程,直到mysql中的进程列表很大,每隔几分钟才变大50。

我怎么能阻止这种情况发生? 我的想法是:

  • 在脚本中添加代码,以便在再次运行之前查看cron是否仍在运行
  • 在运行新的SELECT查询以获取下一个50项
  • 之前,检查mysql表中是否有锁定的表

它们似乎都有起伏,我不确定如何正确实施。 任何人都有任何建议/更好的想法?

1 个答案:

答案 0 :(得分:1)

您可以采取多种方法。

  1. 修改表格以跟踪状态。例如ToDo,Started,Complete。并且只处理“待办事项”。并且在您将其标记为已启动之前不要启动任务。如果cron作业失败,您将需要创建一种重新启动任务的方法。

  2. 如果您无法将任务标记为已完成,请使用交易并回滚该任务的内容。

  3. 同步cron作业的执行,一次只允许执行一次。为此,您可以锁定文件。检查文件的开头,如果无法获得锁定,则退出。

  4. 让cron作业永远运行,而不是定期执行。