如何防止 SQL 代理作业并行运行

ask*_*otl 5 sql-server jobs sql-server-2016

设计一组作业以使它们永远不能同时运行的好方法是什么?

我正在寻找一个通用概念,例如信号量,它可以更轻松地确保某些作业永远不会同时运行。

例如,我正在考虑“信号表”。当作业开始时,它会设置信号,并在结束时重置信号。另外,每个作业都需要等待信号被设置。(如何实现CPU友好的等待?)但是,当作业崩溃时,必须有一个解决方案来自动重置信号,否则作业永远不会启动。

我们有 4 个工作,负责进行各种更新、导入、计算。它们都是由调度程序运行的,此外,如果需要特殊运行,其中一些也可以由超级用户手动启动。但是,它们不应该同时运行,因为这通常会导致锁定甚至死锁,并且数据库无法正确响应用户。

编辑:它是一个数据仓库,正在收集和整合来自多个外部数据源的数据。每个作业负责另一个数据源,如下所示:

  • 作业 #1 每 15 分钟运行一次
  • 工作 #2 每 3 小时一次
  • 作业 #3 和作业 #4 每天运行一次,或者在超级用户启动时额外运行。

J.D*_*.D. 4

除了评论之外,您还可以使用以下一些内容来完成您想要做的事情(因为我不喜欢重新发明锁定系统的轮子)。

您可以使用系统stored procedure msdb.dbo.sp_help_job来确定您的其他jobs作业是否作为每个 中的第一步运行job。然后,您可以从那里选择当另一个运行时您希望它下一步采取什么逻辑,job例如结束job(如果它在例行计划中)或使用 实现模拟睡眠WAITFOR DELAY ('00:00:01') -- Sleeps for 1 second,您可以将其放入WHILE循环中以重新检查job状态。

您可以sp_help_job通过传入名称来调用job

EXEC msdb.dbo.sp_help_job @Job_name = 'TheJobName'
Run Code Online (Sandbox Code Playgroud)

您可以使用过程结果集的列current_execution_statuscurrent_execution_step来帮助您确定何时可以安全地运行当前的job.

还有一些系统可能对您的查询也有帮助,您可以在StackOverflow 答案job tables中阅读这些系统。