Установка: SQL Server 2008 R2
Предыстория: у нас есть процедура, которая вызывается сразу в нескольких потоках. Эти многопоточные вызовы процедур иногда записывают перекрывающиеся (дублирующиеся) данные в таблицу, в которую они записываются. В операторе вставки у меня есть предложение «НЕ СУЩЕСТВУЕТ», чтобы убедиться, что дубликаты не вставлены, но мы все еще получаем дубликаты.
Вопрос. Предложение "НЕ СУЩЕСТВУЕТ" выполняет простой выбор, возможно ли, что, поскольку вставки для потоковых вызовов разделены всего миллисекундами, некоторые индексы (в частности, те, которые используются оператором "НЕ EXISTS" еще не обновлены? Поэтому он не видит существующую запись перед вставкой?
Мысли: Возможно, я не понимаю, как SQL делает свое дело. Если у меня есть вставка с «ГДЕ НЕ СУЩЕСТВУЕТ», проверяет ли она, чтобы убедиться, что ни одна из записей не существует, прежде чем выполнять вставку? Или он проверяет построчно, когда вставляет каждую строку? Если это первое (проверка всего перед выполнением какой-либо вставки), то я полагаю, что возможно, что один из других вызовов еще не завершил вставку.
Я в тупике.
Вот пример того, что я делаю:
INSERT INTO [SomeTable] (Col1,Col2) SELECT ColumnA, ColumnB FROM #TempTable WHERE NOT EXISTS ( SELECT 1 FROM [SomeTable] WHERE Col1 = #TempTable.ColumnA AND Col2 = #TempTable.ColumnB )
test
- person Mark Wilkinson   schedule 06.06.2013