Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wstawiam tylko wiersz, jeśli jeszcze go tam nie ma

A co z wzorcem „JFDI”?

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Poważnie, jest to najszybsze i najbardziej równoczesne bez blokad, szczególnie przy dużych ilościach. Co się stanie, jeśli UPDLOCK zostanie eskalowany i cała tabela jest zablokowana?

Przeczytaj lekcję 4:

Lekcja 4: Podczas opracowywania upsert proc przed dostrojeniem indeksów, najpierw zaufałem, że If Exists(Select…) linia wystrzeliłaby dla każdego przedmiotu i zabroniłaby duplikatów. Nada. W krótkim czasie pojawiły się tysiące duplikatów, ponieważ ten sam element trafiłby na wstawkę w tej samej milisekundzie, a obie transakcje zobaczyłyby brak i wykonałyby wstawianie. Po wielu testach rozwiązanie polegało na użyciu unikalnego indeksu, wychwyceniu błędu i ponownej próbie, aby transakcja mogła zobaczyć wiersz i wykonać aktualizację zamiast wstawiania.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd MSSQL „Dostawca bazowy nie powiódł się podczas otwierania”

  2. SQL Server w systemie Linux

  3. SQL Server IN a wydajność EXISTS

  4. Dlaczego użycie znaku podkreślenia w filtrze LIKE daje mi wszystkie wyniki?

  5. serwer sql niepoprawna nazwa obiektu - ale tabele są wymienione na liście tabel SSMS