排除会话优先级的故障

适用于:SQL ServerAzure SQL 托管实例

本主题提供了与 Service Broker 会话优先级相关的常见故障解除建议。

方法:确定 HONOR_BROKER_PRIORITY 是否为 ON

使用 sys.databasesis_broker_priority_honored 列来确定 HONOR_BROKER_PRIORITY 数据库选项的状态:

    SELECT name AS database_name,
           CASE is_broker_priority_honored
                WHEN 0 THEN N'OFF'
                WHEN 1 THEN N'ON'
           END AS is_broker_priority_honored
    FROM sys.databases
    ORDER BY database_name;

症状:未按优先级顺序发送消息

打开 SQL Server Profiler 跟踪并查看 Broker Remote Message Ack 事件。 StarvationElevation 列中的值为 1 表示为防止“饥饿”现象提高了消息的优先级。 HonorBokerPriority 列中的值为 0 表示未在发送数据库中启用 HONOR_BROKER_PRIORITY 选项。

还应检查 Broker/DBM Transport System Monitor 计数器,了解具有不同优先级别的消息的传输速率。

症状:未按优先级顺序接收消息

RECEIVE 语句仅检索来自一个会话组的消息。 如果来自高优先级会话的消息属于另一个会话组,将不会接收这些消息。

不含 WHERE 子句的 RECEIVE 语句检索来自具有最高优先级且未锁定的会话组的消息。 如果会话组中既有高优先级会话又有低优先级会话,则 RECEIVE 语句可能会检索来自低优先级会话的消息。 即使队列中含有来自其他组中的高优先级会话的消息,也会发生上述情况。

如果 RECEIVE 语句含有指定某个会话组的 WHERE 子句,则该 RECEIVE 语句仅检索来自该指定会话组的消息。 无论来自其他会话组的消息的优先级如何,RECEIVE 语句都将检索来自该组中的低优先级会话的消息。

症状:未对消息分配预定的优先级别

查看 sys.conversation_endpoint 以了解是否对会话端点分配了预定的优先级别。 如果尚未分配,请使用 sys.conversation_priorites,并对照用于会话端点的约定、本地服务以及远程服务,检查为数据库中的会话优先级指定的属性。

另请参阅