Jeg tror i de fleste tilfælde, at forskellene mellem de to vil være små nok til, at valget for det meste bør være drevet af at vælge den implementering, der ender med at være mest forståelig for nogen, der ser på koden for første gang.
Jeg tror dog, at undtagelseshåndtering har nogle få små fordele:
-
Undtagelseshåndtering undgår en potentiel løbstilstand. 'Check, then insert'-metoden kan mislykkes, hvis en anden proces indsætter en post mellem din check og din indsættelse. Så selvom du laver 'tjek og indsæt', vil du stadig have undtagelseshåndtering på indsatsen, og hvis du alligevel allerede udfører undtagelseshåndtering, kan du lige så godt gøre op med den indledende kontrol.
-
Hvis din kode ikke er en lagret procedure og skal interagere med databasen via netværket (dvs. applikationen og db'en er ikke på samme boks), så vil du undgå at have to separate netværksopkald (et til kontrollen og andet for indsatsen) og at gøre det via undtagelseshåndtering giver en ligetil måde at håndtere det hele på med et enkelt netværksopkald. Nu er der tonsvis af måder at gøre 'tjek og indsæt'-metoden på, mens du stadig undgår det andet netværksopkald, men blot at fange undtagelsen er sandsynligvis den enkleste måde at gøre det på.
På den anden side kræver undtagelseshåndtering en unik begrænsning (som i virkeligheden er et unikt indeks), som kommer med en præstationsafvejning:
- Oprettelse af en unik begrænsning vil være langsom på meget store borde, og det vil forårsage et præstationshit på hver enkelt insert til den tabel. På virkelig store databaser skal du også budgettere med den ekstra diskplads, der forbruges af det unikke indeks, der bruges til at håndhæve begrænsningen.
- På den anden side kan det gøre det hurtigere at vælge fra tabellen, hvis dine forespørgsler kan drage fordel af det indeks.
Jeg vil også bemærke, at hvis du er i en situation, hvor det, du rent faktisk vil gøre, er at 'opdatere andet indsæt' (dvs. hvis en post med den unikke værdi allerede eksisterer, så vil du opdatere den post, ellers indsætter du en ny record), så er det, du rent faktisk vil bruge, din særlige databases UPSERT-metode, hvis den har en. For SQL Server og Oracle ville dette være en MERGE-sætning.