Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вмъкване на ред само ако вече не е там

Какво ще кажете за модела "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 на една и съща милисекунда и двете транзакции ще видят, че не съществува и ще извършат вмъкването. След много тестове решението беше да се използва уникалният индекс, да се хване грешката и да се опита отново, позволявайки на транзакцията да види реда и да извърши актуализация вместо вмъкване.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да инсталирам localdb отделно?

  2. SqlDependency не задейства събитие OnChange, когато наборът от данни е променен

  3. Весели туитове за живота на DBA

  4. Как работи COUNT_BIG() в SQL Server

  5. Как да анализирате дейността на една база данни в SQL Server