排除会话优先级的故障
本主题提供了与 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,并对照用于会话端点的约定、本地服务以及远程服务,检查为数据库中的会话优先级指定的属性。
请参阅