A co vzor „JFDI“?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Vážně, toto je nejrychlejší a nejvíce souběžné bez zámků, zvláště při vysokých hlasitostech. Co když je UPDLOCK eskalován a celý stůl je uzamčen?
Přečtěte si lekci 4:
Lekce 4: Při vývoji upsert proc před laděním indexů jsem nejprve věřil, že
If Exists(Select…)
linka by vystřelila pro jakoukoli položku a zakázala by duplikáty. Nada. Během krátké doby se vyskytly tisíce duplikátů, protože stejná položka zasáhla upsert ve stejnou milisekundu a obě transakce by viděly, že neexistuje, a provedly vložení. Po dlouhém testování bylo řešením použít jedinečný index, zachytit chybu a zkusit to znovu, aby transakce mohla vidět řádek a místo vložení provést aktualizaci.