Основные сведения об условиях выдачи уведомлений о запросах

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

  • Возможно, изменились строки, содержащиеся в результатах запроса.

  • Срок действия подписки истекает.

  • Сервер перезапускается.

  • Подписка на уведомление о запросе не может быть создана (например инструкция SELECT не соответствует требованиям, приведенным в разделе Создание запроса с уведомлениями).

  • Сервер сильно загружен.

  • Объекты, от которых зависит подписка, удалены или изменены.

Обратите внимание, что SQL Server может формировать уведомление о запросе в ответ на события, которые не изменяют данные, или в ответ на изменения, которые в действительности не влияют на результаты запроса. Например, если инструкция UPDATE изменяет одну из строк, возвращаемых запросом, то уведомление может формироваться, даже если обновление строки не привело к изменению столбцов в результатах запроса. Уведомления о запросах предназначены для поддержки общей цели повышения производительности приложений, в которых выполняется кэширование данных. При большой загрузке SQL Server может создать сообщение уведомления о запросе для подписки, а не выполнять работу по определению, изменились ли результаты запроса.

Уведомление подписки выполняется перед выполнением компонентом Database Engine каждой инструкции в запросе подписки. Следовательно, если команда содержит и запрос, и инструкцию, которая изменяет данные, возвращаемые запросом, приложение может получить сообщение уведомления до завершения команды, содержащей запрос подписки.

У каждой подписки имеется указанный минимальный срок действия. После истечения минимального срока действия SQL Server удаляет подписку и формирует сообщение уведомления. Сообщение информирует приложение о том, что уведомление больше не активно и что SQL Server больше не отслеживает изменения запроса.

При запуске SQL Server автоматически создает сообщения уведомлений о запросах для всех подписок на уведомления о запросах в базе данных. Это дает возможность приложениям немедленно обновить кэшированные данные и выполнить запуск SQL Server без обработки запроса в каждом уведомлении. При удалении базы данных компонент Database Engine формирует сообщения уведомлений о запросах для всех подписок, зарегистрированных в этой базе данных.

Если запрос подписки на уведомление предоставляется вместе с запросом, не отвечающим требованиям для уведомления о запросе, база данных немедленно формирует сообщение уведомления. Это сообщение информирует приложение о том, что запрос не отвечает требованиям для подписки. Далее, так как SQL Server не может отслеживать изменения в запросе, приложение должно немедленно начать считать, что результаты запроса устарели.

ПримечаниеПримечание

Подписка на уведомление о запросе, управляемая объектом зависимости (например SqlDependency в ADO.NET), не формирует событие, если соединение приложения с базой данных разрывается. Однако если приложение сможет далее вновь подключиться к базе данных, оно немедленно получает уведомления, созданные, когда соединение с базой данных отсутствовало.

Если команда создает сообщение уведомления, процесс создания и посылки этого сообщения является частью выполнения инструкции в рамках транзакции, создающей сообщение. Если компонент Database Engine не может успешно создать и послать сообщение уведомления, команда заканчивается с ошибкой и неудачное завершение команды заносится в журнал ошибок SQL Server. Обратите внимание, что при формировании сообщения уведомления компонент Database Engine удаляет подписку на уведомление, независимо от того, может ли он успешно создать это сообщение.

ПримечаниеПримечание

Подписки удаляются без формирования сообщения уведомления, если учетная запись пользователя базы данных, создавшая подписку, удалена или отключена, если база данных, содержащая подписку, присоединена или если для удаления подписки используется инструкция KILL QUERY NOTIFICATION SUBSCRIPTION.