Какво ще кажете за модела "JFDI"?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Сериозно, това е най-бързо и най-едновременно без заключвания, особено при големи обеми. Ами ако UPDLOCK е ескалиран и цялата таблица е заключена?
Прочетете урок 4:
Урок 4: Когато разработвах процедурата upsert преди настройката на индексите, първо се доверих, че
If Exists(Select…)
линията ще се задейства за всеки артикул и ще забрани дублирането. Нада. За кратко време имаше хиляди дубликати, защото един и същ елемент щеше да удари upsert на една и съща милисекунда и двете транзакции ще видят, че не съществува и ще извършат вмъкването. След много тестове решението беше да се използва уникалният индекс, да се хване грешката и да се опита отново, позволявайки на транзакцията да види реда и да извърши актуализация вместо вмъкване.