В іншому додатку мене вразив поганий дизайн: кілька потоків виконують EnsureDatabaseSchemaExists()
метод одночасно, який в основному виглядає так:
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'MyTable') AND type = N'U') BEGIN
CREATE TABLE MyTable ( ... );
END
Однак, навіть якщо він виконується в транзакції СЕРІАЛІЗАЦІЙНО, цей код не здається безпечним для потоків (тобто паралельний код намагається створити таблицю кілька разів). Чи є якийсь шанс змусити оператор SELECT придбати замок, який заважає іншому потоку виконувати той самий оператор SELECT?
Чи є краща модель для багатопотокових методів EnsureSchemaExists ()?