In einer anderen Anwendung stieß ich auf ein schlechtes Design: Mehrere Threads führen EnsureDatabaseSchemaExists()
gleichzeitig eine Methode aus, die im Grunde so aussieht:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Selbst wenn dieser Code in einer SERIALIZABLE-Transaktion ausgeführt wird, scheint er jedoch nicht threadsicher zu sein (dh der parallele Code versucht, die Tabelle mehrmals zu erstellen). Gibt es eine Möglichkeit, die SELECT-Anweisung zu zwingen, eine Sperre zu erhalten, die verhindert, dass ein anderer Thread dieselbe SELECT-Anweisung ausführt?
Gibt es ein besseres Muster für Multi-Threaded-EnsureSchemaExists () -Methoden?