Konversationsgruppensperren

Service Broker sperrt Konversationgruppen, um zu gewährleisten, dass zu einem bestimmten Zeitpunkt nur ein Warteschlangenleser mit einer Gruppe zusammengehöriger Nachrichten arbeiten kann. Mithilfe von Konversationsgruppensperren garantiert Service Broker, dass Nachrichten genau einmal in der richtigen Reihenfolge verarbeitet werden.

Alle Konversationen gehören zu einer Konversationsgruppe. Jede Konversation gehört standardmäßig zu einer anderen Konversationsgruppe und besitzt somit einen anderen Konversationsgruppenbezeichner. Die MOVE CONVERSATION-Anweisung ändert die Konversationsgruppe für eine Konversation. Die BEGIN DIALOG CONVERSATION-Anweisung enthält Optionen, mit denen sich eine neue Konversation zu einer vorhandenen Konversationsgruppe zuordnen lässt. Weitere Informationen zu Konversationsgruppen finden Sie unter Konversationsgruppen.

Eine Konversationsgruppensperre ist eine exklusive Sperre für eine Gruppe von Nachrichten mit demselben Konversationsgruppenbezeichner. Konversationsgruppensperren zeichnen sich durch Einfachheit, Effizienz und Korrektheit aus. Es gibt keinen expliziten Befehl oder Hinweis zum Abrufen oder Aufheben einer Konversationsgruppensperre. Stattdessen wird mit jedem Service Broker-Befehl, der sich auf einen Dialog oder eine Konversationsgruppe auswirkt, automatisch die entsprechende Konversationsgruppensperre eingerichtet. Mit einer BEGIN DIALOG-Anweisung wird beispielsweise die Konversationsgruppe gesperrt, zu der der neue Dialog gehört, mit einer RECEIVE-Anweisung hingegen die Konversationsgruppe, zu der die empfangenen Nachrichten gehören.

Eine Sitzung wendet eine Konversationsgruppensperre für die Dauer der Transaktion an, innerhalb derer die Sitzung die Sperre abgerufen hat. Die Anwendung einer transaktionsübergreifenden Konversationsgruppensperre ist nicht möglich. Wenn eine Transaktion endet, werden alle während der Transaktion eingerichteten Konversationsgruppensperren freigegeben.

Die Sperre bezieht sich auf die Konversationsgruppe und nicht auf die Konversations-ID. Daher wird die Sperre nur auf eine Seite der Konversation angewendet, selbst wenn sich sowohl der Initiator als auch das Ziel in derselben Datenbank befinden. Eine vom Zieldienst abgerufene Sperre blockiert den initiierenden Dienst nicht (und umgekehrt). Außerdem erzwingt Database Engine (Datenbankmodul) keine Sperre, wenn der Warteschlange eingehende Nachrichten hinzugefügt werden. Database Engine (Datenbankmodul) fügt der Warteschlange auch dann Nachrichten hinzu, wenn eine Anwendung eine Konversationsgruppensperre für die Konversationsgruppe aufweist, zu der die Nachrichten gehören.

Praktisch bedeutet dies, dass eine Anwendung, die nur von Service Broker abgerufene Bezeichner verwendet, nicht warten muss, um Sperren für Service Broker-Ressourcen abzurufen. Die meisten Service Broker-Anwendungen können die Vorteile der von Service Broker bereitgestellten Sperrfunktion nutzen. Dies bedeutet, dass die meisten Service Broker-Anwendungen nur Konversationsgruppenbezeichner und Konversationshandles verwenden, die aus einer Service Broker-Anweisung innerhalb derselben Transaktion abgerufen wurden.

Im Normalfall erhält eine Anwendung beispielsweise einen Konversationsgruppenbezeichner von Service Broker, ruft den Status aus einer Statustabelle ab und verarbeitet dann Nachrichten für Konversationen in der betreffenden Konversationsgruppe. Sobald die Anwendung den Konversationsgruppenbezeichner erhält, belegt sie die Konversationsgruppe mit einer Sperre: Keine andere Instanz der Anwendung kann dann die Sperre abrufen. Die Konversationgruppensperre verhindert jedoch nicht, dass andere Instanzen der Anwendung Nachrichten für andere Konversationsgruppen erhalten und dass eingehende Nachrichten in die Warteschlange gelangen.

Mit dieser Sperrstrategie kann Service Broker gewährleisten, dass die Nachrichten in der richtigen Reihenfolge verarbeitet werden. Da nur ein Warteschlangenleser Nachrichten für eine bestimmte Konversationsgruppe verarbeiten kann, besteht nicht die Gefahr, dass zwei Warteschlangenleser gleichzeitig in derselben Konversationsgruppe Nachrichten empfangen. Die RECEIVE-Anweisung gibt Nachrichten für eine spezifische Konversation in der Reihenfolge zurück, in der sie gesendet wurden. Auf diese Weise können mehrere Warteschlangenleser Nachrichten aus der Warteschlange verarbeiten, ohne dass die Reihenfolge explizit koordiniert werden muss.

Da eine Sperre nicht nur für eine einzelne Konversation, sondern für eine Konversationsgruppe gilt, empfängt ein Warteschlangenleser, der in der RECEIVE-Anweisung keine bestimmte Konversation angibt, möglicherweise Nachrichten aus anderen Konversationen, die zu derselben Konversationsgruppe gehören. Ferner gibt die RECEIVE-Anweisung die nächste verfügbare Nachricht in der Warteschlange zurück, und zwar unabhängig davon, ob diese Nachricht zu einer derzeit nicht gesperrten oder zu einer gesperrten Konversationsgruppe in der aktuellen Transaktion gehört. Um Nachrichten aus einer bestimmten Konversation zu empfangen, geben Sie das Konversationshandle in der RECEIVE-Anweisung an. Um Nachrichten aus einer bestimmten Konversationsgruppe zu empfangen, geben Sie den Konversationsgruppenbezeichner in der RECEIVE-Anweisung an.

Als Ergebnis dieser Sperrstrategie sollte die Anwendung eine Konversationsgruppensperre abrufen, bevor die Statustabelle für die Anwendung aktualisiert wird. Dies geschieht meist automatisch, wenn die Anwendung eine Nachricht empfängt oder eine Konversationsgruppe abruft. Bei der Behandlung von Fehlern muss eine Anwendung aber möglicherweise die Konversationsgruppensperre erneut einrichten, bevor die Statustabelle so aktualisiert wird, dass der Fehler angegeben wird. Weitere Informationen zur Fehlerbehandlung finden Sie unter Fehlerbehandlung für Service Broker.

Die folgenden Anweisungen rufen Konversationsgruppensperren ab: