Bloqueos de grupo de conversación

Service Broker utiliza bloqueos de grupo de conversación para garantizar que sólo un lector de la cola puede trabajar con un conjunto relacionado de mensajes en un momento determinado. Service Broker utiliza bloqueos de grupo de conversación para garantizar que se procesan los mensajes sólo una vez, en orden.

Todas las conversaciones pertenecen a un grupo de conversación. De forma predeterminada, cada conversación pertenece a un grupo de conversación diferente y tiene, por lo tanto, un identificador de grupo de conversación diferente. La instrucción MOVE CONVERSATION cambia el grupo de conversación para una conversación. La instrucción BEGIN DIALOG CONVERSATION contiene las opciones para asociar una nueva conversación con un grupo de conversación existente. Para obtener más información sobre los grupos de conversación, vea Grupos de conversación.

Un bloqueo de grupo de conversación es de hecho un bloqueo exclusivo en un conjunto de mensajes que comparten el mismo identificador de grupo de conversación. Los bloqueos de grupo de conversación están diseñados para ser sencillos, eficaces y exactos. No hay ningún comando explícito o sugerencia para recibir o emitir un bloqueo de grupo de conversación. En su lugar, cada comando de Service Broker que afecta a un diálogo o grupo de conversación recibe automáticamente el bloqueo de grupo de conversación correspondiente. Por ejemplo, una instrucción BEGIN DIALOG bloquea el grupo de conversación al que pertenece el nuevo diálogo, mientras que una instrucción RECEIVE bloquea el grupo de conversación al que pertenecen los mensajes recibidos.

Una sesión mantiene un bloqueo de grupo de conversación durante la transacción dentro de la cual la sesión recibe el bloqueo. Una sesión no puede mantener un bloqueo de grupo de conversación entre transacciones; cuando una transacción finaliza, todos los bloqueos del grupo de conversación recibidos durante la transacción se liberan.

Se produce el bloqueo del grupo de conversación en lugar del bloqueo del identificador de conversación. Por consiguiente, el bloqueo sólo se aplica a un lado de la conversación, incluso cuando el iniciador y el destinatario están en la misma base de datos. Un bloqueo recibido en el servicio de destino no bloquea el servicio iniciador y viceversa. Es más, Database Engine (Motor de base de datos) no aplica el bloqueo al agregar mensajes entrantes a una cola. Database Engine (Motor de base de datos) agrega los mensajes a la cola incluso cuando una aplicación tiene un bloqueo de grupo de conversación en el grupo de conversación al que los mensajes pertenecen.

En la práctica, esto significa que una aplicación que sólo utiliza identificadores recuperados de Service Broker no necesita esperar a recibir los bloqueos en los recursos de Service Broker. La mayoría de las aplicaciones de Service Broker están diseñadas para beneficiarse del bloqueo que Service Broker proporciona. Es decir, la mayoría de las aplicaciones de Service Broker sólo utilizan los identificadores de grupo de conversación e identificadores de conversación obtenidos de una instrucción de Service Broker dentro de la misma transacción.

Por ejemplo, una aplicación recibe normalmente un identificador del grupo de conversación de Service Broker, recupera el estado a partir de una tabla d estados y, a continuación, procesa los mensajes para las conversaciones en ese grupo de conversación. Cuando la aplicación obtiene el identificador del grupo de conversación, la aplicación tiene un bloqueo en el grupo de conversación: ninguna otra instancia de la aplicación puede recibir el bloqueo. Sin embargo, el bloqueo de grupo de conversación no evita que otras instancias de la aplicación reciban mensajes para otros grupos de conversación y tampoco que los mensajes entrantes lleguen a la cola.

Con esta estrategia de bloqueo, Service Broker puede garantizar el procesamiento de mensajes en orden. Dado que sólo un lector de la cola puede procesar los mensajes para un grupo de conversación determinado, no hay ningún riesgo de que dos lectores de la cola reciban los mensajes en el mismo grupo de conversación, al mismo tiempo. Para una conversación concreta, la instrucción RECEIVE devuelve los mensajes en el orden en el que se enviaron los mensajes, de modo que varios lectores de la cola puedan procesar los mensajes de la cola sin tener que coordinar explícitamente la clasificación.

Dado que el bloqueo funciona en un grupo de conversación y no en una conversación individual, un lector de la cola que no especifica una conversación determinada en la instrucción RECEIVE puede recibir los mensajes de conversaciones diferentes que pertenecen al mismo grupo de conversación. Además, la instrucción RECEIVE devuelve el siguiente mensaje disponible en la cola, independientemente de si ese mensaje forma parte de un grupo de conversación actualmente desbloqueado o bloqueado en la transacción actual. Para recibir los mensajes de una conversación determinada, especifique el identificador de conversación en la instrucción RECEIVE. Para recibir los mensajes de un grupo de conversación determinado, especifique el identificador del grupo de conversación en la instrucción RECEIVE.

Como resultado de esta estrategia del bloqueo, su aplicación recibirá un bloqueo de grupo de conversación antes de actualizar la tabla de estados de la aplicación. La mayoría del tiempo, esto sucede automáticamente cuando su aplicación recibe un mensaje u obtiene un grupo de conversación. Al tratar los errores, sin embargo, una aplicación puede necesitar volver a recibir el bloqueo de grupo de conversación antes de actualizar la tabla de estados para indicar el error. Para obtener más información sobre identificadores de errores, vea Control de errores para Service Broker.

Las instrucciones siguientes reciben los bloqueos de grupo de conversación: