Я пытаюсь загрузить несколько строк в целевую таблицу, но только если их еще нет. Классифицированный c запрос левого соединения решает это:
INSERT INTO dbo.DimTarget(SomeData)
SELECT DISTINCT SomeData
FROM #Temp s
LEFT JOIN dbo.DimTarget d ON d.SomeData = s.SomeData
WHERE d.SomeData IS NULL;
Эта вставка выполняется несколько раз параллельно от разных пользователей, которые пытаются вставить одни и те же данные большую часть времени.
Я вижу много дубликатов в таблице (пока нет уникальных ограничений на столбец SomeData) от разных пользователей, что странно, поскольку левое соединение должно обнаружить это и предотвратить вставку, которая уже есть в таблице.
Я исследовал и видел что база данных находится на уровне RCSI (чтение зафиксированного снимка). Моя идея состоит в том, что все параллельные сессии думают, что они являются первыми, вставляющими данные, и все успешно делают это.
Как я могу сделать эту вставку под RCSI? Я хочу, чтобы каждая сессия ждала, если одна сессия уже выполняет свои левые операции вставки.
Любая помощь приветствуется, спасибо! PS: мне не разрешено изменять уровень изоляции БД, к сожалению.