2017-01-25 4 views
0

У меня есть тигр на столе, который выполняет несколько операций. Это бизнес-требования, что эти операции происходят (по крайней мере) заранее определенный интервал времени друг от друга, так что я планирую использовать следующее:WAITFOR DELAY Соотношение производительности

WAITFOR DELAY '00:00:05' 

Я интересно, что (если таковые имеются) из соображений производительности следует принимать во учетной записи при использовании вышеуказанного оператора, приведет ли он к тому, что последующие вставки или обновления в таблице будут заблокированы до завершения триггера или запуск триггера в контексте текущей области?

ответ

1

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

Да, да, это будет. Весь курок триггера выполняется в контексте транзакции для исходной вставки, обновления или удаления. (Всегда есть транзакция, которую вы создаете явно или тот, который SQL Server предоставляет автоматически и который может автоматически совершать).

Вот почему совет заключается в том, чтобы никогда не помещать что-либо медленное (или потенциально замедляющее) внутри триггера - вы сохраняете первоначальную транзакцию и любые блокировки, которые она заработала дольше.

Вместо этого я предлагаю, если вообще можно отделить новое действие от исходного триггера - вы можете отправить сообщение сервис-брокера или добавить строку в таблицу, которую задает агент SQL, чтобы искать новые работать, или что-то еще - просто убедитесь, что это что-то локальное для одной и той же базы данных и быстро.


Обычно этот совет дается в контексте доступа к внешним ресурсам - которые могут быть быстро получить доступ к , когда они там но может быть исключительно медленно сообщать об ошибках, когда что-то сломалось.

+0

Спасибо за ваш ответ. Я фактически использую таблицу очередей, в которой есть столбец DateTime, причина, по которой мне нужно ждать, - это то, что приложение читает эту таблицу и обрабатывает сообщения на основе FIFO. Я мог бы написать DateTime в это поле через 5 секунд из GETDATE(), это решит мою проблему, я думаю. –

+0

@MickWalker - да, это звучит лучше. –