我们有一个清理工作,它调用存储过程,而后者又会删除一天的日志记录。这项工作每五分钟运行一次,通常在不到10秒的时间内完成。有时,需要更长的时间,长达15分钟。在这种情况下,日志表会被锁定,后续事务会超时,直到作业完成。
为了解决这个问题,我们提出了这个解决方案 -
1)删除现有作业的日程安排
2)创建一个新作业,以调用原始作业
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秒后仍在运行,则停止工作。但是,由于作业调用存储过程,这是我的问题:
当作业停止时,它是否还会终止正在执行的存储过程?
答案 0 :(得分:0)
我认为您的查询会被卡住,因为正在更新日志表或与您删除语句同时创建记录。因此,您可能会尝试在删除语句执行时锁定表。更新您在查询中的过程,如exp:delete from logs with(tablock)
答案 1 :(得分:0)
这里,存储过程只是调用另一个嵌套的存储过程。所以不,存储过程不会被停止。控件将返回调用存储过程。您应该在proc中有足够的错误处理来处理被调用的sproc错误的情况。