Em outro aplicativo, fiquei impressionado com o design ruim: vários threads executam um EnsureDatabaseSchemaExists()
método simultaneamente, que se parece basicamente com isso:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
No entanto, mesmo se executado em uma transação SERIALIZABLE, esse código não parece seguro para threads (ou seja, o código paralelo tenta criar a tabela várias vezes). Existe alguma chance de forçar a instrução SELECT a adquirir um bloqueio que impede que outro thread faça a mesma instrução SELECT?
Existe um padrão melhor para métodos Multi-threaded-GuaranteSchemaExists ()?
Minha recomendação seria fazer um melhor esforço de tentativa / captura. Manipule o caso duplicado explicitamente, conforme apropriado, por exemplo. ignore isto...
A verdadeira questão: por que o DDL está sendo executado sob demanda, de vários xacts? Normalmente, a atualização e a migração são um assunto sério, tratadas em janelas de tempo dedicadas ... Você não deseja que sua migração (com o código primeiro?) Seja iniciada inesperadamente, algumas dessas etapas de atualização podem levar horas em uma grande mesa (tamanho de operações de dados ...)
fonte
CREATE TABLE
concessão para operações normais ...