了解查询通知的出现时间

查询通知的真正含义是指在通知消息抵达之前应用程序可以始终依靠缓存数据。如果 SQL Server 不再能够保证缓存数据的可靠性,则 SQL Server 将发送通知消息。只要发生以下一种事件,SQL Server 就会为订阅发送查询通知:

  • 查询的结果中包含的行可能已更改。

  • 订阅过期。

  • 服务器重新启动。

  • 查询通知订阅无法创建(例如,SELECT 语句不符合为通知创建查询中指定的要求)。

  • 服务器负载很重。

  • 订阅所依赖的对象已被删除或修改。

请注意,SQL Server 可能生成查询通知来响应不更改数据的事件,或响应对查询结果没有实际影响的更改。例如,如果 UPDATE 语句更改了查询所返回的某一行,则即使行的更新未更改查询结果中的列,仍然可能会激发通知。查询通知旨在为提高用于缓存数据的应用程序性能的总体目标提供支持。当服务器负载很重时,SQL Server 可能会为订阅生成一个查询通知消息,但不会确定查询结果是否已经更改。

通知订阅在数据库引擎运行订阅请求中的每个语句之前出现。因此,如果命令同时包含查询和对由查询返回的数据进行更改的语句,则应用程序将能够在包含订阅请求的命令结束前收到通知消息。

每个订阅都具有一个指定的最小生存期。在最小生存期之后,SQL Server 会删除订阅并创建通知消息。此消息会通知应用程序该通知不再有效,SQL Server 不再跟踪对查询所做的更改。

当 SQL Server 启动时,服务器自动为数据库中的所有查询通知订阅创建查询通知消息。这样,应用程序可以立即刷新缓存的数据,并且 SQL Server 可以在不处理每个通知中的查询的情况下启动。删除数据库时,数据库引擎为该数据库中注册的所有订阅生成查询通知消息。

如果通知订阅请求由不符合查询通知要求的查询提交,则数据库立即生成一个查询通知消息。此消息通知应用程序此查询不符合订阅的要求。另外,由于 SQL Server 无法跟踪查询的更改,应用程序应立即考虑到查询超时的后果。

注意注意

如果应用程序和数据库之间的连接失败,则由相关性对象(例如,ADO.NET 中的 SqlDependency)管理的查询通知订阅不生成事件。但是,当应用程序可以再次与数据库连接时,应用程序会立即收到与数据库断开连接期间所创建的所有通知。

当命令生成通知消息时,创建和发送通知消息的过程会在生成通知消息的事务中作为语句的一部分出现。如果数据库引擎无法成功创建并发送通知消息,则命令失败并且此失败将被记录在 SQL Server 错误日志中。请注意,无论数据库引擎是否可以成功生成通知消息,数据库引擎都会在生成通知消息时删除通知订阅。

注意注意

当删除或禁用了创建订阅的数据库用户帐户、附加了包含订阅的数据库或者使用 KILL QUERY NOTIFICATION SUBSCRIPTION 删除了订阅后,订阅将被删除而不生成通知消息。