В другом приложении меня поразил плохой дизайн: несколько потоков одновременно выполняют 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 ()?
Моя рекомендация - сделать все возможное, попробовать / поймать. Обрабатывайте дубликат в случае необходимости, например, например. игнорируй это...
Реальный вопрос: почему DDL работает по требованию из нескольких xacts? Обычно обновление и миграция - это серьезный вопрос, который выполняется в выделенных временных окнах ... Вы не хотите, чтобы ваша миграция (сначала с кодом?) Неожиданно запускалась, некоторые из этих шагов обновления могут занять часы на большой таблице (размер операции с данными ...)
источник
CREATE TABLE
грант для нормальных операций ...