¿Qué pasa con el patrón "JFDI"?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
En serio, esto es lo más rápido y lo más concurrente sin bloqueos, especialmente en volúmenes altos. ¿Qué sucede si se escala el UPDLOCK y se bloquea toda la tabla?
Lea la lección 4:
Lección 4: Al desarrollar el proceso upsert antes de ajustar los índices, primero confié en que If Exists(Select…)
la línea se activaría para cualquier elemento y prohibiría los duplicados. Nada. En poco tiempo, hubo miles de duplicados porque el mismo elemento golpearía la inserción en el mismo milisegundo y ambas transacciones verían que no existe y realizarían la inserción. Después de muchas pruebas, la solución fue usar el índice único, detectar el error y volver a intentar permitir que la transacción vea la fila y realice una actualización en lugar de una inserción.