SQL Server: Erro de replicação merge por lock

Se sua replicação do tipo “merge” teve o sincronismo parado e apresenta um erro referente a transação que gerou um deadlock, você se depara com uma situação relativamente incomum, mas não necessariamente rara.

Ao tentar um “reinitiaize subscription” com a geração de um novo snapshot, o mesmo erro persiste.

A mensagem de erro em inglês apresentada é “Message: Transaction (Process ID <id>) was deadlocked on lock resources with another process and been chosen as the deadlock victim. Rerun the transaction.“.

Claro, o “id” do processo é uma variável do seu ambiente.

Como resolver? Aqui segue a dica, válido tanto para as versões do MS sql server 2005 como para o MS sql server 2008 R2.

Na versão do MS sql server 2012, não testei ainda.

 

Segue a receita do bolo:

1. Se o agente estiver em execução, pare (na aba “agents“, dentro do replication monitor);

2. Pare o sincronismo (na aba “All subscriptions“, também no replication monitor);

3. Abra o SQL Server Management Studio e digite o seguinte código:

use <seu_banco_de_dados_replicado>
go
exec sp_helpmergepublication @publication = '<nome do seu publisher>'

4. Anote o “número” apresentado na penúltima coluna, campo “generation_leveling_threshold” . GUARDE este número.
5. Altere o valor deste campo para zero, conforme este código:

exec sp_changemergepublication @publication = '<nome do seu publisher>' 
, @property = 'generation_leveling_threshold' 
, @value = 0

6. Se desejar executar o comando dado no passo 3 para conferir o valor alterado, é um opcional.
7. Gere um novo snapshot (agora deve funcionar, veja pelo status do agente, na aba “agents” do replication monitor;
8. Assim que terminar a geração do novo snapshot, altere novamente o valor do campo “generation_leveling_threshold“, na mesma forma do passo 5, mas ao invés de 0, altere para o mesmo número anotado no passo 4.

exec sp_changemergepublication @publication = '<nome do seu publisher>'
, @property = 'generation_leveling_threshold'
, @value = <o numero que voce guardou no passo 4>

9. Inicie a sincronização e acompanhe.

Isto tudo deve fazer com que sua merge replication volte a funcionar.
Nos primeiros sincronismos, dependendo da sua rede e de quanto desatualizado estiver, é possível que o processo efetivado seja demorado, que dê algum timeout. Mas não se preocupe, o erro apresentado estará resolvido.

 

Gostaria de complementar com alguma informação? Deixe seu comentário, é sempre bem vindo.

Deixe uma resposta