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