ask*_*otl 5 sql-server jobs sql-server-2016
设计一组作业以使它们永远不能同时运行的好方法是什么?
我正在寻找一个通用概念,例如信号量,它可以更轻松地确保某些作业永远不会同时运行。
例如,我正在考虑“信号表”。当作业开始时,它会设置信号,并在结束时重置信号。另外,每个作业都需要等待信号被设置。(如何实现CPU友好的等待?)但是,当作业崩溃时,必须有一个解决方案来自动重置信号,否则作业永远不会启动。
我们有 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_status
和current_execution_step
来帮助您确定何时可以安全地运行当前的job
.
还有一些系统可能对您的查询也有帮助,您可以在StackOverflow 答案job tables
中阅读这些系统。