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 ()?