Verrous de groupe de conversation

S’applique à :SQL ServerAzure SQL Managed Instance

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 conversation différent et possède donc un identificateur de groupe de conversation différent. L’instruction MOVE CONVERSATION modifie le groupe de conversation d’une conversation. L’instruction BEGIN DIALOG CONVERSATION contient des options pour associer une nouvelle conversation à un groupe de conversation existant. Pour plus d’informations sur les groupes de conversation, consultez Groupes de conversation.

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 indicateur explicite pour acquérir ou libérer un verrou de groupe de conversation. 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 BEGIN DIALOG instruction verrouille le groupe de conversations auquel appartient la nouvelle boîte de dialogue, tandis qu’une RECEIVE instruction verrouille le groupe de conversations auquel appartiennent les messages reçus.

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 contenir de verrou de groupe de conversation entre les transactions ; lorsqu’une transaction se termine, tous les verrous de groupe de conversation acquis pendant 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 de lancement, et vice versa. En outre, le moteur de base de données n’applique pas de 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 a un verrou de groupe de conversation sur le groupe de conversations auquel appartiennent les messages.

En pratique, cela signifie qu’une application qui utilise uniquement des identificateurs récupérés à partir de Service Broker n’a pas besoin d’attendre d’acquérir des verrous sur les ressources Service Broker. La plupart des applications Service Broker sont conçues pour tirer parti du verrouillage fourni par Service Broker ; autrement dit, la plupart des applications Service Broker utilisent uniquement des identificateurs de groupe de conversation et des handles de conversation qui ont été obtenus à partir d’une instruction Service Broker au sein de 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 verrou de groupe de conversation n’empêche pas d’autres instances de l’application de recevoir des messages pour d’autres groupes de conversation et n’empêche pas les messages entrants d’arriver dans la file d’attente.

Avec cette stratégie de verrouillage, Service Broker peut garantir un traitement des messages dans l'ordre. Étant donné qu’un seul lecteur de file d’attente peut traiter les messages d’un groupe de conversations donné, il n’existe aucun risque que deux lecteurs de file d’attente reçoivent des messages dans le même groupe de conversation en même temps. Pour une conversation spécifique, l’instruction RECEIVE retourne des messages dans l’ordre dans lequel les messages ont été envoyés, afin que plusieurs lecteurs de file d’attente puissent traiter les messages de la file d’attente sans avoir à coordonner explicitement l’ordre.

Étant donné que le verrouillage fonctionne sur un groupe de conversations plutôt qu’une conversation individuelle, un lecteur de file d’attente qui ne spécifie pas une conversation particulière dans l’instruction RECEIVE peut recevoir des messages provenant de différentes conversations appartenant au même groupe de conversations. En outre, l’instruction RECEIVE retourne le message disponible suivant dans la file d’attente, que ce message fait partie d’un groupe de conversations actuellement déverrouillé ou verrouillé dans la transaction actuelle. Pour recevoir des messages d’une conversation particulière, spécifiez le handle de conversation dans l’instruction RECEIVE . Pour recevoir des messages d’un groupe de conversations particulier, spécifiez l’identificateur du groupe de conversation 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 avoir besoin de réacquire le verrou du 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 :