Partilhar via


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 nó em uma topologia e ter alterações de dados propagadas para os outros nós. Como você pode modificar dados em qualquer nó, alterações de dados em nós diferentes podem entrar em conflito entre si. Se uma linha for modificada em mais de um nó, ela poderá causar um conflito ou até mesmo uma atualização perdida quando a linha é propagada para outros nós.

A replicação ponto a ponto no SQL Server 2008 e versões posteriores fornece a opção de habilitar a detecção de conflitos em uma topologia ponto a ponto. Essa opção ajudaria a evitar os problemas causados por conflitos não detectados, incluindo comportamento inconsistente do aplicativo e atualizações perdidas. Com essa opção habilitada, por padrão, uma alteração conflitante é tratada como um erro crítico que causa a falha do Agente de Distribuição. No caso de um conflito, a topologia permanece em um estado inconsistente até que o conflito seja resolvido e os dados sejam consistentes em toda a topologia.

Observação

Para evitar possíveis inconsistências de dados, evite conflitos em uma topologia ponto a ponto, mesmo com a detecção de conflitos habilitada. Para garantir que as operações de gravação de uma linha específica sejam executadas em apenas um nó, os aplicativos que acessam e alteram dados devem particionar operações de inserção, atualização e exclusão. Esse particionamento garante que as modificações em uma determinada linha originária de um nó sejam sincronizadas com todos os outros nós na topologia antes que a linha seja modificada por um nó diferente. Se um aplicativo exigir recursos sofisticados de detecção e resolução de conflitos, use a replicação de mesclagem. Para obter mais informações, consulte Replicação de Mesclagem e Detectar e Resolver Conflitos de Replicação de Mesclagem.

Noções básicas sobre 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 conflitos. Isso ocorre porque as transações são serializadas e os bloqueios são usados para lidar com alterações simultâneas. Em um sistema distribuído assíncrono, como a replicação ponto a ponto, as transações atuam independentemente em cada nó; e não há mecanismo para serializar transações em vários nós. Um protocolo como a confirmação em duas fases pode ser usado, mas isso afeta significativamente o desempenho.

Em sistemas como a replicação entre pares, os conflitos não são detectados quando as alterações são confirmadas em pares individuais. Em vez disso, eles são detectados quando essas alterações são replicadas e aplicadas em outros pares. Na replicação ponto a ponto, os conflitos são detectados pelos procedimentos armazenados que aplicam alterações a cada nó, com base em uma coluna oculta em cada tabela publicada. Essa coluna oculta armazena uma ID que combina uma ID do originador que você especifica para cada nó e a versão da linha. Durante a sincronização, o Agente de Distribuição executa procedimentos para cada tabela. Esses procedimentos aplicam operações de inserção, atualização e exclusão de outros pares. Se um dos procedimentos detectar um conflito ao ler o valor da coluna oculta, ele gerará o erro 22815 que tem um nível de severidade de 16:

A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s

Por padrão, esse erro faz com que o Agente de Distribuição pare de aplicar alterações neste nó. Para obter informações sobre como lidar com os conflitos detectados, consulte "Manipulando conflitos" mais adiante neste tópico.

Observação

A coluna oculta só pode ser acessada por um usuário conectado por meio da DAC (Conexão de Administrador Dedicado). Para obter informações sobre o DAC, consulte Conexão de Diagnóstico para Administradores de Banco de Dados.

A replicação ponto a ponto detecta os seguintes tipos de conflitos:

  • Inserir-inserir

    Todas as linhas em cada tabela que participam da replicação ponto a ponto são identificadas exclusivamente usando valores de chave primária. Um conflito de inserção ocorre quando uma linha com o mesmo valor de chave foi inserida em mais de um nó.

  • Atualização-atualização

    Ocorre quando a mesma linha foi atualizada em mais de um nó.

  • Inserir ou atualizar

    Ocorre se uma linha foi atualizada em um nó, mas a mesma linha foi excluída e reinserida em outro nó.

  • Inserir-excluir

    Ocorre se uma linha foi excluída em um nó, mas a mesma linha foi excluída e reinserida em outro nó.

  • Atualizar-excluir

    Ocorre se uma linha foi atualizada em um nó, mas a mesma linha foi excluída em outro nó.

  • Apagar-apagar

    Ocorre quando uma linha foi excluída em mais de um nó.

Habilitando a detecção de conflitos

Para usar a detecção de conflitos, todos os nós devem estar executando o SQL Server 2008 ou uma versão posterior; e a detecção deve ser habilitada para todos os nós. No SQL Server 2008 e versões posteriores, por padrão, a detecção de conflitos está habilitada no SQL Server Management Studio. Recomendamos que você tenha a detecção habilitada, mesmo em cenários em que você não espera conflitos. A detecção de conflitos pode ser habilitada e desabilitada usando o Management Studio ou Transact-SQL procedimentos armazenados:

  • 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 da Publicação ou a página Configurar Topologia do Assistente para Configurar Topologia Ponto a Ponto.

    Se você configurar a detecção de conflitos usando o Management Studio, o Agente de Distribuição será configurado para parar de aplicar alterações quando um conflito é detectado.

  • Você também pode habilitar e desabilitar a detecção usando os seguintes procedimentos armazenados: sp_addpublication ou sp_configure_peerconflictdetection.

    Se você configurar a detecção de conflitos usando procedimentos armazenados, poderá especificar se o Agente de Distribuição deve parar de aplicar alterações quando um conflito é detectado. O padrão é que o agente pare. Recomendamos que você use a configuração padrão.

Tratamento de conflitos

Quando ocorre um conflito na replicação ponto a ponto, o alerta de detecção de conflitos ponto a ponto é gerado. Recomendamos que você configure esse alerta para ser notificado quando ocorrer um conflito. Para obter mais informações sobre alertas, consulte Use Alerts for Replication Agent Events.

Depois que o Agente de Distribuição for interrompido e o alerta for acionado, use uma das seguintes abordagens para lidar com os conflitos que ocorreram:

  • Reinicialize o nó em que o conflito foi detectado a partir do backup de um nó que contém os dados necessários (a abordagem recomendada). Esse método garante que os dados estão em um estado consistente.

  • Tente sincronizar o nó novamente, permitindo que o Agente de Distribuição continue a aplicar alterações:

    1. Execute sp_changepublication: especifique 'p2p_continue_onconflict' para o @property parâmetro e true para o @value parâmetro.

    2. Reinicie o Agente de Distribuição.

    3. Verifique os conflitos detectados usando o visualizador de conflitos e determine as linhas envolvidas, o tipo de conflito e o vencedor. O conflito é resolvido com base no valor de ID do originador especificado durante a configuração: a linha que se originou no nó com a ID mais alta vence o conflito. Para obter mais informações, consulte Exibir conflitos de dados para publicações transacionais (SQL Server Management Studio).

    4. Execute a validação para garantir que as linhas conflitantes convergam corretamente. Para obter mais informações, consulte Validar Dados Replicados.

      Observação

      Se os dados forem inconsistentes após essa etapa, você deverá atualizar manualmente as linhas no nó que tem a prioridade mais alta e, em seguida, permitir que as alterações se propaguem desse nó. Se não houver mais alterações conflitantes na topologia, todos os nós serão levados a um estado consistente.

    5. Execute sp_changepublication: especifique 'p2p_continue_onconflict' para o @property parâmetro e false para o @value parâmetro.

Consulte Também

Replicação transacional entre pares