De uitzondering die u ziet, is een direct gevolg van het gebruik van strikte serialisatie. Als je meer dan één transactie tegelijkertijd actief hebt, elk begon met SET TRANSACTIE ISOLATIENIVEAU SERIALISEERBAAR, wanneer een van hen commit, krijgen de anderen een ORA-08177. Dat is hoe strikte serialisatie wordt afgedwongen - de database gooit een ORA-08177 in elke sessie die is gestart met ISOLATION LEVEL SERIALIZABLE als een andere transactie wordt vastgelegd in een tabel die de serialiseerbare sessie nodig heeft. Dus als je echt strikte serialisatie nodig hebt, moet je intelligent omgaan met de ORA-08177's, zoals in het volgende:
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;
Serialisatie is geen magie, en het is niet "gratis" (waar "gratis" betekent "ik als ontwikkelaar hoef niets te doen om het goed te laten werken"). Het vereist meer planning en werk van de ontwikkelaar om het goed te laten functioneren, niet minder. Deel en geniet.