消息保留期

适用于: SQL Server(所有支持的版本) Azure SQL 托管实例

如果某个队列指定了消息保持,则 Service Broker 在会话结束之前不会删除该队列中的消息。 此外,Service Broker 还将传出消息复制到该队列中。 这样,该服务便可以精确地记录传入消息和传出消息。

采用消息保持功能,您可以在队列的会话活动期间精确地记录该会话。 对于需要详细审核,或在会话失败时必须执行补偿事务的应用程序来说,这可能比在会话进行时将每个消息复制到状态表中更加方便。

消息保持功能增加了队列中活动会话的消息数,并增加了 SQL Server 发送消息时所需执行的工作量。 因此,消息保持降低了性能。 对性能的具体影响程度取决于使用队列的服务的通信模式。 通常,应在需要消息保持的任何时候使用消息保持功能,以使应用程序正常运行。 如果应用程序在会话活动期间不需要对所有发送和接收的消息进行精确记录,则在状态表中维护状态可能会提高性能。 同时请记住,在会话结束时,将从队列中删除保留的消息,因此如果您要采用消息保持功能以供审核时使用,则一定要将这些消息复制到永久存储区中,然后再结束该会话。

注意

使用消息保持可能会降低性能。 仅当应用程序服务级别的协议要求应用程序保留发送和接收的确切消息时才使用此设置。队列中准备接收的消息的状态为 1。 RECEIVE 语句将返回状态显示为 1 的消息。 RECEIVE 语句返回一条消息后,它将状态设置为 0,如果启用了消息保留,则会将此消息保留在队列中。 如果禁用了消息保留,则 RECEIVE 语句会将此消息从队列中删除。 使用该队列的服务将同时保存传入消息和传出消息。 在这种情况下,SEND 命令将消息复制到该服务的队列中(状态为 3),并将该消息添加到传输队列中。 当会话结束时,该队列将删除该会话的所有消息。

应用程序无法两次接收同一消息,并且应用程序也无法接收作为传出消息添加至该队列的消息。 若要使用保留的消息,请使用 SELECT 语句查询该队列。 为便于审核,应用程序先将保留的消息插入到审核表中,然后再结束会话。 对于补偿事务,应用程序通常反向执行已处理的消息并依次撤消对每个消息所做的工作,直到处理完所有消息为止。

有关使用 SELECT 语句访问队列的详细信息,请参阅查询队列

另请参阅