Параллельная вставка несуществующих строк под RCSI - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь загрузить несколько строк в целевую таблицу, но только если их еще нет. Классифицированный 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: мне не разрешено изменять уровень изоляции БД, к сожалению.

1 Ответ

0 голосов
/ 06 марта 2020

Таблица подсказки READCOMMITEDLOCK является ответом, но все еще имеет некоторую проблему с этим, опубликует еще один вопрос об этом.

...