Share via


Bloqueios de grupo de conversação

O Service Broker usa bloqueios de grupo de conversação para garantir que somente um leitor de fila possa trabalhar com um conjunto relacionado de mensagens em qualquer tempo determinado. O Service Broker usa bloqueios de grupo de conversação para garantir que as mensagens sejam processadas exatamente uma vez, em ordem.

Todas as conversações pertencem a um grupo de conversação. Por padrão, cada conversação pertence a um grupo de conversação diferente e, portanto, tem um identificador de grupo de conversação diferente. A instrução MOVE CONVERSATION altera o grupo de conversação para uma conversação. A instrução BEGIN DIALOG CONVERSATION contém opções para associar uma nova conversação com um grupo de conversação existente. Para obter mais informações sobre grupos de conversação, consulte Grupos de conversação.

Um bloqueio de grupo de conversação é, efetivamente, um bloqueio exclusivo em um conjunto de mensagens que compartilha o mesmo identificador de grupo de conversação. Os bloqueios de grupo de conversação são criados para se obter simplicidade, eficiência e exatidão. Não há nenhum comando explícito ou dica para adquirir ou liberar um bloqueio de grupo de conversação. Em vez disso, todo comando do Service Broker que afeta um diálogo ou grupo de conversação adquire o bloqueio de grupo de conversação apropriado automaticamente. Por exemplo, uma instrução BEGIN DIALOG bloqueia o grupo de conversação ao qual o novo diálogo pertence, enquanto uma instrução RECEIVE bloqueia o grupo de conversação ao qual as mensagens recebidas pertencem.

Uma sessão mantém um bloqueio de grupo de conversação durante a transação na qual a sessão adquiriu o bloqueio. Uma sessão não pode manter um bloqueio de grupo de conversação nas transações; quando uma transação termina, todos os bloqueios de grupo de conversação adquiridos durante a transação são liberados.

Ocorre bloqueio para o grupo de conversação e não para a ID de conversação. Portanto, o bloqueio é aplicável somente a um lado da conversação, até mesmo quando o iniciador e o destino estão no mesmo banco de dados. Um bloqueio adquirido pelo serviço de destino não bloqueia o serviço inicial e vice-versa. Além disso, o Mecanismo de Banco de Dados não aplica o bloqueio ao adicionar mensagens de entrada a uma fila. O Mecanismo de Banco de Dados adiciona mensagens à fila mesmo quando um aplicativo tem um bloqueio de grupo de conversação no grupo de conversação ao qual a mensagem pertence.

Em termos práticos, isso significa que um aplicativo que usa somente identificadores recuperados do Service Broker não precisa aguardar para adquirir bloqueios nos recursos do Service Broker. A maioria dos aplicativos do Service Broker é criada para se beneficiar do bloqueio fornecido pelo Service Broker. Isso é, a maioria dos aplicativos do Service Broker usa somente os identificadores de grupo de conversação e identificadores de conversação que foram obtidos de uma instrução do Service Broker na mesma transação.

Por exemplo, um aplicativo normalmente obtém um identificador de grupo de conversação do Service Broker, recupera o estado da tabela de estado e, em seguida, processa as mensagens para as conversações naquele grupo de conversação. Depois de o aplicativo obter o identificador do grupo de conversação, ele tem um bloqueio no grupo de conversação: nenhuma outra instância do aplicativo poderá adquirir o bloqueio. Entretanto, o bloqueio do grupo de conversação não impede outras instâncias do aplicativo de receber mensagens para outros grupos de conversação e não impede as mensagens de entrada de entrarem na fila.

Com essa estratégia de bloqueio, o Service Broker pode garantir processamento de mensagem em ordem. Como somente um leitor de fila pode processar mensagens para um determinado grupo de conversação, não há risco de dois leitores de fila receberem mensagens no mesmo grupo de conversação ao mesmo tempo. Para uma conversação específica, a instrução RECEIVE retorna mensagens na ordem em que as mensagens foram enviadas, portanto, vários leitores de fila podem processar mensagens da fila sem ter quer coordenar explicitamente a ordenação.

Como o bloqueio opera em um grupo de conversação em vez de em uma conversação individual, um leitor de fila que não especifica uma conversação específica na instrução RECEIVE poderá receber mensagens de diferentes conversações pertencentes ao mesmo grupo de conversação. Além disso, a instrução RECEIVE retorna a próxima mensagem disponível na fila, independentemente de a mensagem fazer parte de um grupo de conversação que esteja desbloqueado no momento ou bloqueado na transação atual. Para receber mensagens de uma conversação específica, especifique o identificador da conversação na instrução RECEIVE. Para receber mensagens de um grupo de conversação específico, especifique o identificador de grupo de conversação na instrução RECEIVE.

Como resultado desta estratégia de bloqueio, seu aplicativo deve adquirir um bloqueio de grupo de conversação antes de atualizar a tabela de estado do aplicativo. Na maioria das vezes, isso ocorre automaticamente quando seu aplicativo recebe uma mensagem ou obtém um grupo de conversação. Entretanto, durante o tratamento de erros, um aplicativo pode precisar readquirir o bloqueio de grupo de conversação antes de atualizar a tabela de estado para indicar o erro. Para obter mais informações sobre como tratar erros, consulte Tratamento de erros do Service Broker.

As instruções a seguir adquirem bloqueios de grupo de conversação: