Em outro aplicativo, fui atingido por um 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 ser thread-safe (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 impeça outro thread de fazer a mesma instrução SELECT?
Existe um padrão melhor para métodos EnsureSchemaExists() multi-threaded?