Bloqueios do grupo de conversação

Aplica-se a:SQL ServerAzure SQL Managed Instance

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

Todas as conversas pertencem a um grupo de conversação. Por padrão, cada conversa pertence a um grupo de conversação diferente e, portanto, tem um identificador de grupo de conversação diferente. A MOVE CONVERSATION declaração altera o grupo de conversação para uma conversa. A BEGIN DIALOG CONVERSATION instrução contém opções para associar uma nova conversa a 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 é, na verdade, um bloqueio exclusivo em um conjunto de mensagens que compartilham o mesmo identificador de grupo de conversação. Os bloqueios de grupo de conversação são projetados para simplicidade, eficiência e correção. Não há nenhum comando ou dica explícita para adquirir ou liberar um bloqueio de grupo de conversa. Em vez disso, cada comando do Service Broker que afeta uma caixa de diálogo ou um grupo de conversação adquire automaticamente o bloqueio de grupo de conversação apropriado. Por exemplo, uma BEGIN DIALOG instrução bloqueia o grupo de conversação ao qual a nova caixa de diálogo pertence, enquanto uma RECEIVE instrução 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 dentro da qual a sessão adquiriu o bloqueio. Uma sessão não pode manter um bloqueio de grupo de conversação em transações; Quando uma transação termina, todos os bloqueios de grupo de conversação adquiridos durante a transação são liberados.

O bloqueio ocorre para o grupo de conversação e não para o ID da conversação. Portanto, o bloqueio só se aplica a um lado da conversa, 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 impõe 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 as mensagens pertencem.

Em termos práticos, isso significa que um aplicativo que usa apenas identificadores recuperados do Service Broker não precisa esperar para adquirir bloqueios nos recursos do Service Broker. A maioria dos aplicativos do Service Broker é projetada para aproveitar o bloqueio fornecido pelo Service Broker; ou seja, a maioria dos aplicativos do Service Broker usa apenas identificadores de grupo de conversação e identificadores de conversa que foram obtidos de uma instrução do Service Broker dentro da mesma transação.

Por exemplo, um aplicativo normalmente obtém um identificador de grupo de conversação do Service Broker, recupera o estado de uma tabela de estados e, em seguida, processa mensagens para conversas nesse grupo de conversação. Depois que o aplicativo obtém o identificador do grupo de conversação, o aplicativo tem um bloqueio no grupo de conversação: nenhuma outra instância do aplicativo pode adquirir o bloqueio. No entanto, o bloqueio do grupo de conversação não impede que outras instâncias do aplicativo recebam mensagens para outros grupos de conversação e não impede que as mensagens de entrada cheguem à fila.

Com essa estratégia de bloqueio, o Service Broker pode garantir o processamento de mensagens em ordem. Como apenas um leitor de filas 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 específica, a RECEIVE instrução retorna mensagens na ordem em que as mensagens foram enviadas, para que vários leitores de fila possam processar mensagens da fila sem ter que coordenar explicitamente a ordem.

Como o bloqueio opera em um grupo de conversação em vez de uma conversa individual, um leitor de filas RECEIVE que não especifica uma conversa específica na instrução pode receber mensagens de conversas diferentes que pertencem ao mesmo grupo de conversação. Além disso, a RECEIVE instrução retorna a próxima mensagem disponível na fila, independentemente de essa mensagem fazer parte de um grupo de conversa que está atualmente desbloqueado ou está bloqueado na transação atual. Para receber mensagens de uma conversa específica, especifique o RECEIVE identificador de conversa na instrução. Para receber mensagens de um grupo de conversação específico, especifique o identificador do grupo de conversação RECEIVE na instrução.

Como resultado dessa estratégia de bloqueio, seu aplicativo deve adquirir um bloqueio de grupo de conversação antes de atualizar a tabela de estados do aplicativo. Na maioria das vezes, isso acontece automaticamente quando seu aplicativo recebe uma mensagem ou recebe um grupo de conversa. Ao lidar com erros, no entanto, um aplicativo pode precisar readquirir o bloqueio do grupo de conversação antes de atualizar a tabela de estados para indicar o erro. Para obter mais informações sobre tratamento de erros, consulte Tratamento de erros para o Service Broker.

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