Verrous de groupes de conversations

Service Broker utilise des verrous de groupes de conversations pour garantir qu'un seul agent de lecture de file d'attente à la fois peut manipuler un ensemble de messages associé. Service Broker utilise ces verrous de groupes de conversations pour s'assurer que les messages sont traités précisément une fois, dans l'ordre.

Toutes les conversations appartiennent à des groupes de conversations. Par défaut, chaque conversation appartient à un groupe de conversations spécifique ; elle possède donc un identificateur de groupe de conversations qui lui est propre. L'instruction MOVE CONVERSATION modifie le groupe de conversations d'une conversation. L'instruction BEGIN DIALOG CONVERSATION contient des options permettant d'associer une nouvelle conversation à un groupe de conversations existant. Pour plus d'informations sur les groupes de conversations, consultez Groupes de conversations.

Un verrou de groupe de conversation est en fait un verrou exclusif sur un ensemble de messages qui partagent le même identificateur de groupe de conversations. Les verrous de groupes de conversations sont conçus à des fins de simplicité, d'efficacité et d'exactitude. Il n'existe aucune commande ou indication explicite pour l'obtention ou la libération d'un verrou de groupe de conversations. En fait, chaque commande Service Broker qui a une incidence sur un dialogue ou un groupe de conversations acquiert automatiquement le verrou de groupe de conversations approprié. Par exemple, une instruction BEGIN DIALOG verrouille le groupe de conversations auquel le nouveau dialogue appartient, alors qu'une instruction RECEIVE verrouille le groupe de conversations auquel les messages reçus appartiennent.

Une session maintient un verrou de groupe de conversations pour la durée de la transaction dans laquelle la session a acquis le verrou. Une session ne peut pas maintenir un verrouillage des groupes de conversations sur plusieurs transactions ; lorsqu'une transaction se termine, tous les verrous de groupes de conversations acquis durant la transaction sont libérés.

Le verrouillage intervient pour le groupe de conversations et non pour l'ID de conversation. Par conséquent, le verrou s'applique uniquement à un côté de la conversation, même lorsque l'initiateur et la cible sont tous deux situés dans la même base de données. Un verrou acquis par le service cible ne bloque pas le service initiateur, et inversement. En outre, le Moteur de base de données n'applique pas le verrouillage lors de l'ajout de messages entrants à une file d'attente. Le Moteur de base de données ajoute des messages à la file d'attente même lorsqu'une application détient un verrou sur le groupe de conversations auquel les messages appartiennent.

En pratique, cela signifie qu'une application qui utilise uniquement des identificateurs extraits de Service Broker n'a pas besoin d'attendre pour acquérir des verrous sur les ressources de Service Broker. La plupart des applications Service Broker sont conçues pour tirer parti du verrouillage assuré par Service Broker. Autrement dit, le plus souvent, les applications Service Broker utilisent exclusivement des identificateurs de groupe de conversations et des descripteurs de conversation qui ont été obtenus d'une instruction Service Broker dans la même transaction.

Par exemple, une application obtient généralement un identificateur de groupe de conversations auprès de Service Broker, extrait l'état d'une table d'état, puis traite les messages des conversations appartenant à ce groupe de conversations. Une fois que l'application a obtenu l'identificateur du groupe de conversations, elle détient un verrou sur le groupe de conversations : aucune autre instance de l'application ne peut acquérir le verrou. Toutefois, le verrouillage d'un groupe de conversations n'empêche pas d'autres instances de l'application de recevoir des messages pour d'autres groupes de conversations, et il n'empêche pas l'arrivée des messages entrants dans la file d'attente.

Avec cette stratégie de verrouillage, Service Broker peut garantir un traitement des messages dans l'ordre. Étant donné que seul un agent de lecture de file d'attente peut traiter les messages d'un groupe de conversations spécifique, deux agents de lecture de file d'attente ne peuvent pas recevoir simultanément des messages dans le même groupe de conversations. Pour une conversation spécifique, l'instruction RECEIVE retourne les messages dans l'ordre dans lequel ils ont été envoyés. Par conséquent, plusieurs agents de lecture de file d'attente peuvent traiter les messages de la file d'attente sans devoir coordonner explicitement le classement.

Dans la mesure où le verrouillage s'opère sur un groupe de conversations et non sur une conversation individuelle, un agent de lecture de file d'attente qui ne spécifie pas une conversation spécifique dans l'instruction RECEIVE peut recevoir des messages de différentes conversations qui appartiennent au même groupe de conversations. Qui plus est, l'instruction RECEIVE retourne le prochain message disponible dans la file d'attente, que ce message fasse partie d'un groupe de conversations actuellement déverrouillé ou verrouillé dans la transaction actuelle. Pour recevoir les messages d'une conversation spécifique, spécifiez le descripteur de conversation dans l'instruction RECEIVE. Pour recevoir les messages d'un groupe de conversations spécifique, spécifiez l'identificateur de groupe de conversations dans l'instruction RECEIVE.

En raison de cette stratégie de verrouillage, votre application doit acquérir un verrou de groupe de conversations avant de mettre à jour la table d'état de l'application. La plupart du temps, ceci se produit automatiquement lorsque votre application reçoit un message ou obtient un groupe de conversations. Toutefois, lors de la gestion des erreurs, une application peut être amenée à réacquérir le verrou de groupe de conversations avant de mettre à jour la table d'état pour indiquer l'erreur. Pour plus d'informations sur la gestion des erreurs, consultez Gestion des erreurs pour Service Broker.

Les instructions suivantes acquièrent des verrous de groupes de conversations :