В другом приложении меня поразил плохой дизайн: несколько потоков одновременно выполняют EnsureDatabaseSchemaExists()
метод, который выглядит в основном так:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Однако, даже если он выполняется в транзакции SERIALIZABLE, этот код не кажется поточно-ориентированным (т. Е. Параллельный код пытается создать таблицу несколько раз). Есть ли шанс заставить оператор SELECT получить блокировку, которая мешает другому потоку выполнить тот же оператор SELECT?
Есть ли лучший шаблон для многопоточных методов EnsureSchemaExists ()?