Che dire del modello "JFDI"?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Seriamente, questo è il più veloce e il più simultaneo senza blocchi, specialmente ad alti volumi. Cosa succede se UPDLOCK viene escalation e l'intera tabella è bloccata?
Leggi la lezione 4:
Lezione 4: Durante lo sviluppo dell'upsert proc prima di ottimizzare gli indici, mi sono innanzitutto fidato del fatto che If Exists(Select…)
la linea verrebbe attivata per qualsiasi articolo e vieterebbe i duplicati. Nada. In breve tempo si sono verificati migliaia di duplicati perché lo stesso articolo avrebbe colpito l'upsert allo stesso millisecondo ed entrambe le transazioni avrebbero visto un non esiste ed avrebbero eseguito l'inserimento. Dopo molti test, la soluzione era utilizzare l'indice univoco, rilevare l'errore e riprovare consentendo alla transazione di vedere la riga ed eseguire un aggiornamento anziché un inserimento.