Ponto a ponto – Detecção de conflitos na replicação ponto a ponto

Aplica-se: SQL Server

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 fornece a opção de habilitar 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 Agente de Distribuição. 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.

Nota

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 Mesclar a replicação e Detectar e resolver conflitos na replicação de mesclagem.

Entender 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 controlam 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 ou mais colunas ocultas em cada tabela publicada.

Antes do SQL Server 2019 (15.x) CU 13, o SQL Server adiciona uma coluna oculta a cada tabela publicada: $sys_p2p_cd_id. Essa coluna oculta armazena uma ID que combina uma ID de originador que você especifica para cada nó e a versão da linha.

No SQL Server 2019 (15.x) CU 13 e posteriores, se você criar a publicação ponto a ponto com o @p2p_conflictdetection_policy = 'lastwriter', o SQL Server adicionará uma coluna oculta a cada tabela publicada: $sys_md_cd_id. Essa coluna oculta armazena o datetime como um tipo de dados datetime2.

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 pontos. Se um dos procedimentos detectar um conflito quando ele ler os valores da coluna oculta, ocorrerá 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 o Agente de Distribuição pare de aplicar alterações naquele nó. Para obter informações sobre como controlar os conflitos detectados, confira Lidar com conflitos.

Nota

A coluna oculta pode ser acessada somente por um usuário registrado pela conexão de administrador dedicada (DAC). 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:

  • 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 conflitos, habilite a detecção para todos os nós. Por padrão, a detecção de conflitos é habilitada quando você configura a replicação ponto a ponto no 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.

    Se você configurar a detecção de conflito usando o Management Studio, o Agente de Distribuição 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

    • sp_configure_peerconflictdetection.

      Se você configurar a detecção de conflito usando os procedimentos armazenados, poderá especificar se o Agente de Distribuição 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.

Lidar com conflitos

Quando ocorrer um conflito na replicação ponto a ponto, o alerta de detecção de conflitos ponto a ponto será emitido. Configure esse alerta de forma que você seja notificado quando ocorrer um conflito. Para obter mais informações sobre alertas, consulte Usar alertas para eventos do agente de replicação.

Depois que o Agente de Distribuição 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.

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

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

    2. Reinicie o Agente de Distribuição.

    3. 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 Exibir conflitos de dados em publicações transacionais (SQL Server Management Studio).

    4. Execute a validação para garantir que as linhas de conflito se encontraram corretamente. Para obter mais informações, consulte Validar os dados replicados.

      Nota

      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.

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

Lidar automaticamente com conflitos com Last Writer Wins

A partir do SQL Server 2019 (15.x) CU 13, você pode configurar a replicação ponto a ponto para resolver conflitos automaticamente, permitindo que a inserção ou atualização mais recente ganhe o conflito. Se uma das gravações excluir a linha, o SQL Server permitirá a exclusão para superar o conflito. Esse método é chamado de Last Writer Wins.

Use procedimentos armazenados para configurar a última gravação vence. Confira Configurar a resolução e detecção de conflitos de Last Writer Wins. Não é possível configurar a última gravação vence com SQL Server Management Studio.

Nota

A replicação ponto a ponto com Last Writer Wins depende de ter os relógios dos nós participantes em sincronia para obter resultados confiáveis. Se os relógios dos servidores participantes ficarem muito fora de sincronia, o resultado de uma resolução de conflitos poderá ser inesperado e/ou indesejável. Por exemplo, se o servidor A tiver um relógio preciso, mas o servidor B estiver uma semana atrás, o servidor A será escolhido para ganhar todos os conflitos, mesmo que não tenha sido o último a atualizar a linha. Caso não seja possível manter os relógios dentro da tolerância necessária para a resolução de resultados, talvez convenha escolher uma estratégia de resolução de conflitos diferente.