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.