【问题标题】:Status of Stored Procedure call from Agent job, when job is stopped作业停止时,来自代理作业的存储过程调用的状态
【发布时间】: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


【解决方案1】:

我认为您的查询卡住了,因为日志表正在更新或与您删除语句同时创建记录。因此,您可能会在执行删除语句时尝试锁定表。在查询中更新您的过程,如下所示:delete from logs with(tablock)

【讨论】:

  • 您似乎没有理解这个问题。我想知道的是——如果从作业中调用存储过程,如果作业停止,执行是否会停止?
【解决方案2】:

这里,一个存储过程只是调用另一个嵌套的存储过程。所以不,存储过程不会停止。控件将返回到调用存储过程。您应该在 proc 中有足够的错误处理来处理被调用的 sproc 出错的情况。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 2018-05-13
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 2013-08-08
    • 1970-01-01
    相关资源
    最近更新 更多