我已经为作业建模,并且它是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/