Состояние вызова хранимой процедуры из задания агента, когда задание остановлено

У нас есть задание очистки, которое вызывает хранимую процедуру, которая, в свою очередь, удаляет записи за один день для таблицы журнала. Это задание выполняется каждые пять минут и обычно завершается менее чем за 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 секунд. Однако, поскольку задание вызывает хранимую процедуру, вот мой вопрос:

Когда задание остановлено, будет ли оно также завершать выполняемую хранимую процедуру?


person Raj    schedule 19.01.2015    source источник
comment
Как бы я ни пытался, я не могу отформатировать код. Интересно, что не так?   -  person Raj    schedule 19.01.2015


Ответы (2)


Я думаю, что ваш запрос застревает, потому что таблица журнала обновляется или создает записи одновременно с вашим оператором удаления. Таким образом, вы можете попытаться заблокировать таблицу во время выполнения оператора удаления. обновите свою процедуру внутри запроса, как это выражение: delete from logs with(tablock)

person Mohammed    schedule 19.01.2015
comment
Вы, кажется, не поняли вопроса. Все, что я хочу знать, это - если хранимая процедура вызывается из задания, остановится ли выполнение, если задание будет остановлено? - person Raj; 19.01.2015

Здесь хранимый процесс просто вызывает другой вложенный хранимый процесс. Так что нет, сохраненный процесс не будет остановлен. Управление вернется к вызывающей сохраненной процедуре. У вас должна быть достаточная обработка ошибок в процедуре, чтобы позаботиться о сценариях, в которых вызывается ошибка sproc.

person SouravA    schedule 19.01.2015