Den undtagelse, du ser, er en direkte konsekvens af at bruge streng serialisering. Hvis du har mere end én transaktion aktiv på samme tid, startede hver med SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, når en af dem forpligter, vil de andre få en ORA-08177. Det er sådan streng serialisering håndhæves - databasen kaster en ORA-08177 i enhver session startet med ISOLATION LEVEL SERIALIZABLE, hvis en anden transaktion forpligter sig til en tabel, som den serialiserbare session har brug for. Så dybest set, hvis du virkelig har brug for streng serialisering, skal du håndtere ORA-08177'erne intelligent, som i følgende:
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;
Serialisering er ikke magi, og det er ikke "gratis" (hvor "gratis" betyder "jeg som udvikler behøver ikke at gøre noget for at få det til at fungere ordentligt"). Det kræver mere planlægning og arbejde fra bygherrens side at få det til at fungere ordentligt, ikke mindre. Del og nyd.