Detecção de conflitos na replicação ponto a ponto
A replicação transacional ponto a ponto permite inserir, atualizar ou excluir dados em qualquer modo em uma topologia e faz com que as alterações de dados sejam propagadas para os outros nós. Uma vez que você pode alterar dados em qualquer nó, as alterações de dados em nós diferentes podem entrar em conflito umas com as outras. Se uma linha for modificada em mais de um nó, isso poderá causar um conflito ou mesmo uma atualização perdida quando a linha for propagada para outros nós.
A replicação ponto a ponto no SQL Server 2008 introduz a opção de ativar a detecção de conflito por uma topologia ponto a ponto. Essa opção ajuda a evitar os problemas causados por conflitos não detectados, inclusive o comportamento inconsistente do aplicativo e as atualizações perdidas. Com essa opção habilitada, por padrão uma alteração de conflito é tratada como erro crítico que causa a falha do Distribution Agent. No evento de um conflito, a topologia é mantida em um estado inconsistente até que o conflito seja resolvido e os dados sejam tornados consistentes em toda a topologia.
Observação |
---|
Para evitar inconsistência potencial de dados, certifique-se de evitar conflitos em uma topologia ponto a ponto, mesmo com a detecção de conflitos ativada. Para assegurar que as operações de gravação de uma linha particular sejam realizadas em um único nó, os aplicativos que acessam e alteram dados devem realizar operações de partição, inserção, atualização e exclusão. Esse particionamento assegurará que as modificações em uma determinada linha originária de um nó sejam sincronizadas com todos os outros nós da topologia antes que a linha seja modificada por um outro nó. Se um aplicativo requerer detecção de conflito e recursos de resolução sofisticados, use a replicação de mesclagem. Para obter mais informações, consulte Visão geral da replicação de mesclagem. e Detectando e resolvendo conflitos de replicação de mesclagem. |
Entendendo conflitos e detecção de conflitos
Em um único banco de dados, as alterações feitas na mesma linha por aplicativos diferentes não causam um conflito. Isso ocorre uma vez que as transações são serializadas, e os bloqueios são usados para controlar as alterações simultâneas. Em um sistema distribuído assíncrono como a replicação ponto a ponto, as transações agem de maneira independente em cada nó e não há nenhum mecanismo para serializar as transações por diversos nós. Um protocolo como o protocolo 2PC pode ser usado, mas isso afeta o desempenho significativamente.
Em sistemas como replicação ponto a ponto, os conflitos não são detectados quando as alterações são confirmadas em pontos individuais. Ao contrário, eles são detectados quando essas alterações são replicadas e aplicadas em outros pontos. Na replicação ponto a ponto, os conflitos são detectados pelos procedimentos armazenados que se aplicam a alterações em cada nó, com base em uma coluna oculta em cada tabela publicada. Essa coluna oculta armazena uma ID que combina uma ID de originador que você especifica para cada nó e a versão da linha. Durante a sincronização, o Distribution Agent executa procedimentos para cada tabela. Esses procedimentos aplicam operações de inserção, atualização e exclusão de outros pontos. Se um dos procedimentos detectar um conflito quando ele ler o valor de coluna oculta, ocorrerá o erro 22815 que tem um nível de gravidade de 16:
Um conflito de tipo '%s' foi detectado no ponto %d entre o ponto %d (entrada), ID de transação %s e ponto %d (no disco), ID de transação %s
Por padrão, esse erro faz o Distribution Agent pare de aplicar alterações naquele nó. Para obter informações sobre como controlar os conflitos detectados, consulte "Controlando conflitos" posteriormente neste tópico.
Observação |
---|
A coluna oculta pode ser acessada somente por um usuário registrado pela conexão de administrador dedicada (DAC). Para obter informações sobre DAC, consulte Usando uma conexão de administrador dedicada [SQL Server]. |
A replicação ponto a ponto detecta os seguintes tipos de conflitos:
Inserção-inserção
Todas as linhas em cada tabela que participa da replicação ponto a ponto são identificadas exclusivamente usando valores de chave primários. Um conflito inserção-inserção ocorre quando uma linha com o mesmo valor de chave é inserida em mais de um nó.
Atualização-atualização
Ocorre quando a mesma linha foi atualizada em mais de um nó.
Inserção-atualização
Ocorre se uma linha foi atualizada em um nó, mas a mesma linha foi excluída e, em seguida, reinserida em outro nó.
Inserção-exclusão
Ocorre se uma linha foi excluída em um nó, mas a mesma linha foi excluída e, em seguida, reinserida em outro nó.
Atualização-exclusão
Ocorre se uma linha foi atualizada em um nó, mas a mesma linha foi excluída em outro.
Exclusão-exclusão
Ocorre quando uma linha foi excluída em mais de um nó.
Habilitando a detecção de conflito
Para usar a detecção de conflito, todos os nós devem ser executados no SQL Server 2008 ou uma versão posterior; e a detecção deve estar habilitada para todos os nós. No SQL Server 2008 e versões posteriores, por padrão, a detecção de conflito é habilitada em SQL Server Management Studio. Recomendamos que você habilite a detecção, até mesmo em cenários nos quais você não espera nenhum conflito. A detecção de conflito pode ser habilitada e desabilitada usando os procedimentos armazenados do Management Studio ou Transact-SQL:
Você pode habilitar e desabilitar a detecção no Management Studio usando a página Opções de Assinatura da caixa de diálogo Propriedades de Publicação ou a página Configurar Topologia do Assistente para Configurar Topologia Ponto a Ponto. Para obter mais informações, consulte Como configurar a detecção de conflitos para replicação transacional ponto a ponto (SQL Server Management Studio).
Se você configurar a detecção de conflito usando o Management Studio, o Distribution Agent será configurado para parar de aplicar as alterações quando um conflito for detectado.
Você também pode habilitar e desabilitar a detecção usando os seguintes procedimentos armazenados: sp_addpublication ou sp_configure_peerconflictdetection. Para obter mais informações, consulte Como configurar a detecção de conflitos para replicação transacional ponto a ponto (Programação Transact-SQL de replicação).
Se você configurar a detecção de conflito usando os procedimentos armazenados, poderá especificar se o Distribution Agent deve parar de aplicar as alterações quando um conflito for detectado. O padrão é o agente parar. Recomendamos o uso da configuração padrão.
Controlando conflitos
Quando ocorrer um conflito na replicação ponto a ponto, o alerta de detecção de conflito ponto a ponto é emitido. Recomendamos que você configure esse alerta de forma que você seja notificado quando ocorrer um conflito. Para obter mais informações sobre alertas, consulte Usando alertas para eventos do Replication Agent.
Depois que o Distribution Agent parar e o alerta for emitido, use uma das abordagens a seguir para controlar os conflitos ocorridos:
Reinicialize o nó no qual o conflito foi detectado a partir do backup de um nó que contém os dados obrigatórios (a abordagem recomendada). Esse método garante que os dados estejam em um estado consistente. Para obter mais informações, consulte o procedimento para adicionar um nó a uma topologia em Como configurar a replicação transacional ponto a ponto (Programação Transact-SQL de replicação).
Tente sincronizar o nó novamente permitindo que o Distribution Agent continue a aplicar as alterações:
Execute sp_changepublication: specify 'p2p_continue_onconflict' para o parâmetro @property e true para o parâmetro @value.
Reinicie o Distribution Agent.
Verifique os conflitos detectados usando o visualizador de conflitos e determine as linhas que foram envolvidas, o tipo de conflito e o vencedor. O conflito é resolvido com base no valor da ID do originador especificado durante a configuração: a linha originada no nó com a ID mais alta vence o conflito. Para obter mais informações, consulte Como exibir conflitos de dados para publicações transacionais (SQL Server Management Studio).
Execute a validação para garantir que as linhas de conflito se encontraram corretamente. Para obter mais informações, consulte Validando os dados replicados.
Observação Se os dados forem inconsistentes depois dessa etapa, você deve atualizar manualmente as linhas no nó que tem a prioridade mais alta e, em seguida, permitir que as alterações propagem a partir desse nó. Se não houver nenhuma outra alteração conflitante na topologia, todos os nós serão levados para um estado consistente.
Execute sp_changepublication: specify 'p2p_continue_onconflict' para o parâmetro @property e false para o parâmetro @value.