Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie man MERGE serialisierbar macht

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.