Hur är det med "JFDI"-mönstret?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Seriöst, detta är snabbast och mest samtidigt utan lås, särskilt vid höga volymer. Vad händer om UPDLOCK eskaleras och hela bordet är låst?
Läs lektion 4:
Lektion 4: När jag utvecklade upsert-processen innan jag justerade indexen litade jag först på att
If Exists(Select…)
linje skulle aktiveras för alla objekt och skulle förbjuda dubbletter. Nada. På kort tid fanns det tusentals dubbletter eftersom samma artikel skulle träffa upsert på samma millisekund och båda transaktionerna skulle se att en inte existerade och utföra infogningen. Efter mycket testande var lösningen att använda det unika indexet, fånga felet och försöka igen så att transaktionen kunde se raden och utföra en uppdatering istället en infogning.