Die Ausnahme, die Sie sehen, ist eine direkte Folge der Verwendung einer strikten Serialisierung. Wenn Sie mehr als eine Transaktion gleichzeitig aktiv haben, jede mit SET TRANSACTION ISOLATION LEVEL SERIALIZABLE gestartet, erhalten die anderen ein ORA-08177, wenn eine von ihnen festschreibt. Auf diese Weise wird eine strenge Serialisierung erzwungen - die Datenbank wirft einen ORA-08177 in jeder Sitzung, die mit ISOLATION LEVEL SERIALIZABLE gestartet wurde, wenn eine andere Transaktion in eine Tabelle festgeschrieben wird, die die serialisierbare Sitzung benötigt. Also, wenn Sie wirklich eine strenge Serialisierung brauchen, müssen Sie die ORA-08177's intelligent handhaben, wie im Folgenden:
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;
Serialisierung ist keine Zauberei, und sie ist nicht „kostenlos“ (wobei „kostenlos“ bedeutet „Ich als Entwickler muss nichts tun, damit sie richtig funktioniert“). Es erfordert mehr Planung und Arbeit seitens des Entwicklers, damit es richtig funktioniert, nicht weniger. Teilen und genießen.