Partilhar via


Detecção e resolução de conflitos em atualização em fila

Como as assinaturas de atualização em fila permitem modificações nos mesmos dados em vários locais, pode haver conflitos quando os dados são sincronizados no servidor Publicador. A replicação detecta conflitos quando as alterações são sincronizadas com o Publicador e resolve esses conflitos usando a política de resolução selecionada ao criar a publicação. Os seguintes conflitos podem ocorrer:

  • Actualize e insira conflitos. Esse conflito ocorre quando os mesmos dados são alterados em dois locais. Uma mudança ganha, e a outra perde.

  • Excluir conflitos. Esse conflito ocorre quando a mesma linha é excluída em um local e alterada na outra.

A detecção e a resolução de conflitos podem ser um processo demorado e com uso intensivo de recursos; portanto, é melhor minimizar conflitos no aplicativo criando partições de dados para que diferentes Assinantes modifiquem diferentes subconjuntos de dados.

Detectando conflitos

Ao criar uma publicação e habilitar a atualização por fila, a replicação adiciona a coluna uniqueidentifier (msrepl_tran_version) com o padrão de newid() à tabela subjacente. Quando os dados publicados são alterados tanto no Publicador quanto no Assinante, a linha recebe um novo identificador global exclusivo (GUID) para indicar que uma nova versão da linha existe. O Queue Reader Agent usa essa coluna durante a sincronização para determinar se existe um conflito.

Uma transação em uma fila mantém os valores antigos e novos das versões de linhas. Quando a transação é aplicada no Publicador, os GUIDs da transação e o GUID na publicação são comparados. Se o GUID antigo armazenado na transação corresponder ao GUID na publicação, a publicação será atualizada e a linha será atribuída ao novo GUID que foi gerado pelo Assinante. Ao atualizar a publicação com o GUID da transação, você obtém versões de linha correspondentes na publicação e na transação.

Se o GUID antigo armazenado na transação não corresponder ao GUID na publicação, um conflito será detectado. O novo GUID na publicação indica que existem duas versões de linha diferentes: uma na transação que está sendo enviada pelo assinante e uma mais recente que existe no publicador. Nesse caso, outro Assinante ou Publicador atualizou a mesma linha na publicação antes de essa transação do Assinante ser sincronizada.

Diferentemente da replicação de mesclagem, uma coluna GUID não é utilizada para identificar a linha em si, mas serve para verificar se a linha foi alterada.

Resolvendo conflitos

Ao criar uma publicação usando a atualização na fila, você seleciona um resolvedor de conflitos a ser usado se algum conflito for detectado. O resolvedor de conflitos rege como o Queue Reader Agent lida com versões diferentes da mesma linha encontrada durante a sincronização. Você pode alterar a política de resolução de conflitos depois que a publicação for criada, desde que não haja assinaturas para a publicação. As opções de resolvedor de conflitos são as seguintes:

  • O Publicador vence (o padrão)

  • O Publicador vence e a assinatura é reinicializada

  • O assinante vence

Os conflitos são registrados e podem ser exibidos usando o Visualizador de Conflitos.

Para definir a política de resolução de conflitos de atualização em fila

Para exibir conflitos de dados

Editora Vitórias

Quando a resolução de conflitos é configurada para que o Publicador vença, a consistência transacional é mantida com base nos dados do Publicador. A transação conflitante é revertida no Assinante que a iniciou.

O Queue Reader Agent detecta um conflito e os comandos de compensação são gerados e propagados para o Assinante postando-os no banco de dados de distribuição. Em seguida, o Agente de Distribuição aplica os comandos de compensação ao Assinante que originou a transação conflitante. As ações de compensação atualizam as linhas no Assinante para corresponder às linhas no Publicador.

Até que os comandos de compensação sejam aplicados, é possível ler os resultados de uma transação que eventualmente será revertida no Assinante. Isso é equivalente a uma leitura suja (nível de isolamento não confirmado de leitura). Não há compensação para as transações dependentes subsequentes que podem ocorrer. No entanto, os limites de transação são respeitados e todas as ações dentro de uma transação são confirmadas ou, no caso de um conflito, revertidas.

O Publicador vence e a assinatura é reinicializada

Reinicializar o assinante para resolver conflitos mantém uma consistência transacional rigorosa no assinante, porém pode ser um processo demorado se a publicação contiver grandes volumes de dados.

Quando o Queue Reader Agent detecta um conflito, todas as transações restantes na fila (incluindo a transação em conflito) são rejeitadas e o Assinante é marcado para reinicialização. O próximo instantâneo gerado para a publicação é aplicado ao Assinante pelo Agente de Distribuição.

Vitórias do Assinante

A detecção de conflitos sob a política onde o Assinante ganha significa que a última transação do Assinante que atualiza o Publicador é a vencedora. Nesse caso, quando um conflito é detectado, a transação enviada pelo Assinante ainda é utilizada e o Publicador é atualizado. Essa política é adequada para aplicativos em que essas alterações não comprometem a integridade dos dados.

Consulte Também

Assinaturas atualizáveis para replicação transacional