【发布时间】:2015-01-19 06:37:46
【问题描述】:
我们有一个清理作业,它调用一个存储过程,该过程又会删除日志表一天的记录。此作业每五分钟运行一次,通常在 10 秒内完成。有时,它需要更长的时间,长达 15 分钟。在这种情况下,日志表被锁定并且后续事务超时,直到作业完成。
为了解决这个问题,我们想出了这个解决方案 -
1) 移除现有作业的调度
2) 新建一个job,调用原来的job
3) 安排新作业每 5 分钟运行一次
4) 见下面的新工作代码
DECLARE @JobToRun NVARCHAR(128) = N'OM_EDU_Purge logs'
EXEC msdb.dbo.sp_start_job @JobToRun
WAITFOR DELAY '00:00:20'
IF EXISTS(SELECT 1
FROM msdb.dbo.sysjobs J
JOIN msdb.dbo.sysjobactivity A
ON A.job_id=J.job_id
WHERE J.name=@JobToRun
AND A.run_requested_date IS NOT NULL
AND A.stop_execution_date IS NULL
)
BEGIN -- job is running or finishing (not idle)
EXEC msdb.dbo.sp_stop_job @job_name=@JobToRun
-- could log info, raise error, send email etc here
END
这似乎工作正常,如果 20 秒后仍在运行,则停止作业。但是,由于作业调用存储过程,这是我的问题:
当作业停止时,它是否也会终止正在执行的存储过程?
【问题讨论】:
-
无论我如何尝试,我都无法格式化代码。不知道怎么了?
标签: sql-server tsql sql-agent-job