我已经为作业建模,并且它是sql表中的依赖项:
作业(ID,详细信息,退出代码)
依赖项(job_id,dependenet_job_id)

例如:如果作业1取决于2和3,则表将具有以下内容:
工作
1个“ job1”为NULL
2“ job2” NULL
3“ job3” NULL
4“ job4” NULL

依存关系
1 2
1 3

现在,我需要找到可以下一步运行的作业。在上述情况下,可以运行2,3和4,因为它们没有任何依赖性。仅当2和3成功完成(退出代码= 0)时,1才能运行。

这些表可以具有数百个作业和多级依赖关系。我有查询来获取使用左外部联接没有依赖项的作业。但是在查找依赖关系已成功完成的作业时遇到了麻烦。

谢谢。

最佳答案

对于“嵌套的”依赖关系(即job1取决于job2取决于job3),您将需要一个递归查询,MySQL不支持该递归查询。

您可以查看有关如何reengineer your tables处理递归的文章。

您可以做的另一件事是:

每当作业完成时,都会删除或取消其依赖关系(将布尔列active添加到依赖关系表中)。

这样,您可以运行

SELECT jobs.* FROM jobs
    LEFT JOIN depends ON (jobs.id = depends.parent_id AND depends.active = TRUE)
    WHERE depends.child_id IS NULL
          AND jobs.started = FALSE;


这将返回所有尚未启动但没有活动依赖项的作业。

选择作业后,即可运行

UPDATE jobs SET started=TRUE WHERE id = @JOB_ID;


当它完成时,

UPDATE jobs SET exitcode=@EXIT_CODE WHERE id = @JOB_ID;
UPDATE dependencies SET active = FALSE WHERE child_id = @JOB_ID;
-- or
DELETE FROM dependencies WHERE child_id = @JOB_ID;

关于mysql - MySQL查询以查找具有相关性的作业完成,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19748066/

10-16 15:37