Freigeben über


Nachrichtenbeibehaltung

Wenn für eine Warteschlange die Nachrichtenbeibehaltung angegeben ist, löscht Service Broker keine Nachrichten aus der Warteschlange, bis die Konversation beendet wird. Zudem kopiert Service Broker auch ausgehende Nachrichten in die Warteschlange. Dies ermöglicht es dem Dienst, einen genauen Datensatz der eingehenden und ausgehenden Nachrichten zu verwalten.

Mithilfe der Nachrichtenbeibehaltung können Sie einen genauen Datensatz einer Konversation für eine Warteschlange verwalten, während die Konversation aktiv ist. Bei Anwendungen, für die eine detaillierte Überwachung erforderlich ist oder die bei einem Konversationsfehler kompensierende Transaktionen ausführen müssen, kann dies zweckmäßiger sein, als jede Nachricht in eine Statustabelle zu kopieren, während die Konversation noch läuft.

Durch die Nachrichtenbeibehaltung wird die Anzahl der Nachrichten in der Warteschlange für aktive Konversationen erhöht. Außerdem steigt die Arbeitslast von SQL Server beim Senden von Nachrichten. Deshalb wirkt die Nachrichtenbeibehaltung leistungsmindernd. Die genauen Auswirkungen auf die Leistung hängen von den Kommunikationsmustern für die Dienste ab, die die Warteschlange verwenden. Grundsätzlich sollten Sie die Nachrichtenbeibehaltung nutzen, wenn sie für den ordnungsgemäßen Betrieb einer Anwendung erforderlich ist. Falls die Anwendung keinen genauen Datensatz aller gesendeten und empfangenen Nachrichten erfordert, während die Konversation aktiv ist, kann es sich positiv auf die Leistung auswirken, wenn der Zustand in einer Statustabelle verwaltet wird. Berücksichtigen Sie auch, dass die beibehaltenen Nachrichten bei Beendigung der Konversation aus der Warteschlange entfernt werden. Wenn Sie die Beibehaltung zu Überwachungszwecken verwenden, dürfen Sie nicht vergessen, die Nachrichten vor dem Ende der Konversation in einen permanenten Speicher zu kopieren.

HinweisHinweis

Die Verwendung der Nachrichtenbeibehaltung kann die Leistung mindern. Diese Einstellung sollte nur verwendet werden, wenn in der Vereinbarung zum Servicelevel (SLA, Service Level Agreement) der Anwendung festgelegt ist, dass die Anwendung die genauen gesendeten und empfangenen Nachrichten beibehalten muss.

Nachrichten in einer Warteschlange, die empfangen werden können, haben den Status 1. Die RECEIVE-Anweisung gibt Nachrichten zurück, die einen Status von 1 haben. Nachdem die RECEIVE-Anweisung eine Nachricht zurückgegeben hat, wird der Status auf 0 festgelegt und die Nachricht bei aktivierter Nachrichtenbeibehaltung in der Warteschlange behalten. Wenn die Nachrichtenbeibehaltung deaktiviert ist, wird die Nachricht mit der RECEIVE-Anweisung aus der Warteschlange gelöscht. Jeder Dienst, der die Warteschlange verwendet, speichert sowohl eingehende als auch ausgehende Nachrichten. In diesem Fall werden die Nachrichten mit dem SEND-Befehl in die Warteschlange für den Dienst kopiert (wobei status auf 3 festgelegt ist) sowie der Übertragungswarteschlange hinzugefügt. Wenn die Konversation beendet wird, werden alle Nachrichten für die Konversation aus der Warteschlange gelöscht.

Eine Anwendung kann nicht zweimal dieselbe Nachricht empfangen. Ferner kann eine Anwendung keine Nachricht empfangen, die der Warteschlange als ausgehende Nachricht hinzugefügt wurde. Wenn Sie mit beibehaltenen Nachrichten arbeiten möchten, verwenden Sie eine SELECT-Anweisung zum Abfragen der Warteschlange. Zur Überwachung fügt eine Anwendung die beibehaltenen Nachrichten vor dem Ende der Konversation in eine Überwachungstabelle ein. Bei kompensierenden Transaktionen geht eine Anwendung gewöhnlich die verarbeiteten Nachrichten rückwärts durch und macht die Vorgänge für jede Nachricht nacheinander rückgängig, bis alle Nachrichten verarbeitet wurden.

Weitere Informationen zur Verwendung von SELECT-Anweisungen zum Zugreifen auf eine Warteschlange finden Sie unter Abfragen von Warteschlangen.