A implantação da solução falha com o erro “Violação da restrição PRIMARY KEY 'PK_Classes'”
-
10-12-2019 - |
Pergunta
Em nosso script de instalação, que instala várias soluções juntas, descobrimos que ocasionalmente as soluções falhavam na implantação com o seguinte erro no log do ULS:
System.Data.SqlClient.SqlException:Violação da restrição de chave primária 'PK_Classes'.Não é possível inserir a chave duplicada no objeto 'dbo.classes'.
Isso ocorre tanto com o Powershell quanto com o stsadm.
Solução
Tínhamos uma lógica que chamava Install-SPSolution duas vezes em soluções diferentes (mesmo comportamento observado com stsadm) e, em seguida, uma lógica para aguardar a conclusão da implantação.Em casos raros, o que aconteceu foi que ambas as soluções tentavam adquirir o bloqueio de implantação antes que qualquer um dos threads conseguisse o bloqueio;um thread seria bem-sucedido e outro falharia com a exceção de chave primária.
Então o log ficaria assim:
Solution Deployment : Acquiring deployment job lock for server ... solutionA.wsp
Solution Deployment : Acquiring deployment job lock for server ... solutionB.wsp
Solution Deployment : Successfull ACQUIRED deployment job lock for server ... solutionA.wsp
System.Data.SqlClient.SqlException: Violation of PRIMARY KEY constraint 'PK_Classes'. Cannot insert duplicate key in object 'dbo.Classes'.
Em vez de:
Solution Deployment : Acquiring deployment job lock for server ... solutionA.wsp
Solution Deployment : Successfull ACQUIRED deployment job lock for server ... solutionA.wsp
Solution Deployment : Acquiring deployment job lock for server ... solutionB.wsp
(seguido pela solução B sendo negada e aguardando a conclusão da solução A)
A solução é instalar uma solução, aguardar a conclusão e depois instalar outra.Há alguns exemplos de como esperar usando a propriedade JobExists na solução aqui: Detectando o status de implantação da solução.Não é realmente mais lento fazer isso dessa maneira (não mais do que o intervalo de espera), porque nos bastidores o SharePoint executa um trabalho e depois o outro de qualquer maneira, quando os bloqueios são adquiridos corretamente.