2015-01-19 5 views
0

У нас есть работа по очистке, которая вызывает хранимую процедуру, которая, в свою очередь, удаляет записи за журнал за один день. Это задание выполняется каждые пять минут и обычно заканчивается менее чем за 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 [email protected] 
         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 @[email protected]     
       -- could log info, raise error, send email etc here 
      END 

Кажется, что он работает нормально и прекращает работу, если он все еще работает через 20 секунд. Однако, поскольку работа вызывает хранимую процедуру, вот мой вопрос:

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

+0

Независимо от того, как я пытаюсь, я не могу отформатировать код. Интересно, что не так? – Raj

ответ

0

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

+0

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

0

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