Развертывание решения не удается с ошибкой «Нарушение первичного ключа ограничения PK_Classes»
-
10-12-2019 - |
Вопрос
В нашем установочном скрипте, который устанавливает несколько решений вместе, мы обнаружили, что решения иногда не развернули развертывание со следующей ошибкой в журнале ULS:
system.data.sqlclient.sqlexception: нарушение первичного ключа ограничение 'pk_classes'.Не удается вставить дубликатную клавишу в объекте 'dbo.classes'.
Это происходит с PowerShell, так и STSADM.
Решение
У нас была логика, которая дважды звонила в SPSILOL SPSOLOL на разных решениях (та же поведение, наблюдаемое с помощью STSADM), а затем логику для ожидания развертывания для завершения. В редких случаях, что произошло, состоит в том, что оба решения пытались приобрести блокировку развертывания до того, как либо нить получила блокировку; Один поток добится успеха, и один из них будет терпит неудачу с первичным ключевым исключением.
Так будет выглядеть журнал:
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'.
.
вместо:
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
.
(с последующим раствором отказано и ждет решения для завершения)
Решение - установить одно решение, подождите его завершить, затем установите другой. Есть некоторые образцы того, как ждать, как ждать, используя свойство Jobexists на решении здесь: Обнаружение статуса развертывания решения . Это не очень медленнее сделать это таким образом (не больше, чем ваш интервал ожидания), потому что за кулисами SharePoint проходит одну работу, а затем все в любом случае, когда замки будут правильно приобретены.