In un'altra applicazione sono stato colpito da una cattiva progettazione: più thread eseguono un EnsureDatabaseSchemaExists()
metodo contemporaneamente, che assomiglia sostanzialmente a questo:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Tuttavia, anche se eseguito in una transazione SERIALIZZABILE, questo codice non sembra essere thread-safe (ovvero il codice parallelo tenta di creare la tabella più volte). C'è qualche possibilità di forzare l'istruzione SELECT ad acquisire un blocco che impedisce a un altro thread di fare la stessa istruzione SELECT?
Esiste un modello migliore per i metodi multi-threaded-SecureSchemaExists ()?