Häufig ist es notwendig herauszufinden, in welchem Status – offen (auch PENDING) oder abgeschlossen – sich Transaktionen befinden, um in Abhängigkeit davon andere Operationen auszuführen. Ist zum Beispiel eine INSERT
-Operation schon abgeschlossen, oder wird diese noch weitergeführt? Das Release 2 zur Oracle-Datenbank 11g bietet dafür die neue Funktion WAIT_ON_PENDING_DML
an.
Eine etwas umständliche Lösung wäre es, in regelmäßigen Abständen die View V$TRANSACTION
abzufragen. Ab Oracle Database 11g Release 2 gibt es allerdings die Funktion WAIT_ON_PENDING_DML
im Package DBMS_UTILITY
, die diese Aufgabenstellung stark vereinfacht. Wie der Name schon anzeigt, handelt es sich um eine Funktion, die je nach Status der Transaktion, den Booleschen Wert TRUE
oder FALSE
zurückgibt. Der Status TRUE
bedeutet, dass eine Transaktion abgeschlossen ist. Der Status FALSE
weist hingegen auf eine offene Transaktion hin. Dabei wartet die Prozedur bis alle Transaktionen, die Sperren auf den gelisteten Tabellen haben und deren Beginn vor einer bestimmten SCN (System Change Number
) liegt, entweder mit COMMIT
oder ROLLBACK
abgeschlossen wurden. Ohne Angabe einer Wartezeit (TIMEOUT) wartet die Funktion so lange, bis die Transaktion abgeschlossen ist.
Das folgende Listing zeigt eine simple Anwendung der Funktionalität. Die Funktion INSERT_T
fügt beliebige Zahlen in eine Tabelle T
ein. Die LOOP
-Schleife stellt dabei sicher, dass der Vorgang einige Zeit – ungefähr 40 bis 50 Sekunden – andauern wird.
CREATE OR REPLACE PROCEDURE insert_t AS
BEGIN
FOR i IN 1..100 LOOP
INSERT INTO t VALUES (dbms_random.value );
dbms_lock.sleep( .5 );
END LOOP;
COMMIT;
END;
/
Die nachfolgende Prozedur dient der Abfrage mit der Funktion WAIT_ON_PENDING_DML
. Erforderlich ist dabei die Angabe der betroffenen Tabellen – im vorliegenden Beispiel die Tabelle T
des Users SCOTT
und zusätzlich ein Timeout-Wert (Zeitüberschreitung), der die maximale Wartezeit vorgibt. Im Beispiel wird eine geringe Wartezeit von 10 Sekunden angegeben, um beim Warten auf die Transaktion einen Timeout zu erzielen.
CREATE OR REPLACE PROCEDURE wait_test AS
v_bool BOOLEAN;
v_scn NUMBER;
BEGIN
v_bool:= dbms_utility.wait_on_pending_dml (tables=>'SCOTT.T',
timeout=>10,scn=>v_scn );
dbms_output.put_line('scn: ' || v_scn );
IF v_bool
THEN dbms_output.put_line( 'Beendet' );
ELSE dbms_output.put_line( 'Timeout' );
END IF;
END;
/
Anschließend wird die Prozedur INSERT_T
in der Session des Benutzers SCOTT ausgeführt und parallel in einer anderen Session die Prozedur WAIT_TEST
angestoßen. Das Ergebnis sieht nach 10 Sekunden wie folgt dargestellt aus:
Die Funktion WAIT_ON_PENDING_DML ist in 11g Release 2 eingeführt worden, um die Technologie der Edition Based Redefinition
zu unterstützen. Das Abfragen von laufenden DML-Transaktionen (Data Manipulation Language, Datenmodifikationsanweisungen
) in der „alten“ Edition und die entsprechenden Aktionen können damit kontrolliert durchgeführt werden. (Ulrike Schwinn /am)
datenbanken
Weitere News:
Verlinke auf uns!
Verlinke auf codekicker.de von deinem Blog oder aus deiner Forensignatur:
databasepro berichtet alle zwei Monate praxisnah über die Themen, die professionelle Datenbank-Architekten, -Administratoren, Consultants, Anwender und IT-Manager, die sich mit der Auswahl von Technologien, Plattformen, Datenbanken und Entwicklungsumgebungen beschäftigen, Tag für Tag brauchen.