sql >> Base de Datos >  >> RDS >> Oracle

Cómo hacer MERGE serializable

La excepción que está viendo es una consecuencia directa del uso de una serialización estricta. Si tiene más de una transacción activa simultáneamente, cada una comenzó con SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, cuando cualquiera de ellas confirme, las demás obtendrán un ORA-08177. Así es como se aplica la serialización estricta:la base de datos arroja un ORA-08177 en cualquier sesión iniciada con NIVEL DE AISLAMIENTO SERIALIZABLE si otra transacción se confirma en una tabla que necesita la sesión serializable. Entonces, básicamente, si realmente necesita una serialización estricta, debe manejar los ORA-08177 de manera inteligente, como se muestra a continuación:

DECLARE
  bSerializable_trans_complete  BOOLEAN := FALSE;
  excpSerializable              EXCEPTION;
  PRAGMA EXCEPTION_INIT(excpSerializable, -08177);
BEGIN
  <<SERIALIZABLE_LOOP>>
  WHILE NOT bSerializable_trans_complete
  LOOP
    BEGIN
      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

      MERGE ...; -- or whatever

      COMMIT;

      bSerializable_trans_complete := TRUE;  -- allow SERIALIZABLE_LOOP to exit
    EXCEPTION
      WHEN excpSerializable THEN
        ROLLBACK;
        CONTINUE SERIALIZABLE_LOOP;
    END;
  END LOOP;  -- SERIALIZABLE_LOOP
END;

La serialización no es mágica y no es "gratuita" (donde "gratis" significa "yo, como desarrollador, no tengo que hacer nada para que funcione correctamente"). Requiere más planificación y trabajo por parte del desarrollador para que funcione correctamente, no menos. Comparte y disfruta.