当队列指定消息保留时,Service Broker 不会在会话结束之前从队列中删除消息。 此外,Service Broker 还将传出消息复制到该队列中。 这样,该服务便可以精确地记录传入消息和传出消息。
采用消息保持功能,您可以在队列的会话活动期间精确地记录该会话。 对于需要详细审核,或在会话失败时必须执行补偿事务的应用程序来说,这可能比在会话进行时将每个消息复制到状态表中更加方便。
消息保持功能增加了队列中活动会话的消息数,并增加了 SQL Server 发送消息时所需执行的工作量。 因此,消息保持降低了性能。 对性能的具体影响程度取决于使用队列的服务的通信模式。 通常,应在需要消息保持的任何时候使用消息保持功能,以使应用程序正常运行。 如果应用程序在会话处于活动状态时不需要所有已发送和接收消息的确切记录,则状态表中的维护状态可能会提高性能。 另请记住,会话结束时,将从队列中删除保留的消息,因此,如果出于审核目的使用保留,则必须在结束会话之前将消息复制到永久存储。
注意
使用消息保持可能会降低性能。 仅当应用程序服务级别协议要求应用程序保留发送和接收的确切消息时,才应使用此设置。 已准备好接收的队列中的消息的状态为 1。 该 RECEIVE 语句返回显示状态为 1 的消息。 在 RECEIVE 语句返回消息后,它将状态设置为 0,并在消息保留处于打开状态时将消息保留在队列中。 如果消息保留期已关闭,该 RECEIVE 语句将从队列中删除该消息。 使用该队列的服务将同时保存传入消息和传出消息。 在这种情况下,SEND 命令会将消息复制到服务的队列(其 status 为 3),并将消息添加到传输队列。 当会话结束时,该队列将删除该会话的所有消息。
应用程序无法接收同一消息两次,应用程序无法接收作为传出消息添加到队列的消息。 若要处理保留的消息,请使用 SELECT 语句查询队列。 为便于审核,应用程序先将保留的消息插入到审核表中,然后再结束会话。 对于补偿事务,应用程序通常反向执行已处理的消息并依次撤消对每个消息所做的工作,直到处理完所有消息为止。
有关使用 SELECT 语句访问队列的详细信息,请参阅 查询队列。