sql >> Base de Datos >  >> RDS >> Sqlserver

Solo insertando una fila si aún no está allí

¿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.