代码之家  ›  专栏  ›  技术社区  ›  fiscme

如何确保sql表未被锁定/停止并发crons

  •  0
  • fiscme  · 技术社区  · 11 年前

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

    这一直很有效,直到将项目标记为完整的表被某些东西锁定,而这些项目没有被标记掉。然后cron再次运行,检查了同样的50个项目。

    这种情况不断重复,直到mysql中的进程列表变得庞大,并且每隔几分钟就会增加50。

    我怎样才能阻止这种事情的发生? 我的想法是:

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

    它们似乎都有起有落,我不确定如何正确实施。 有人有什么建议/更好的主意吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Conrad Frix    11 年前

    你可以采取几种方法。

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

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

    3. 同步cron作业的执行,以便一次只允许执行一次。要做到这一点,你可以锁定一个文件。在开始时检查文件,如果无法获得锁,则退出。

    4. 让cron作业以睡眠的方式永远运行,而不是定期执行。