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.