| 

.NET C# Java Javascript Exception

0

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:

SQL> execute wait_test
scn: 13693132
Timeout
Elapsed: 00:00:10.00

Nach Ablauf der Gesamtzeit von INSERT_T gibt die Prozedur WAIT_TEST dann das folgende Ergebnis aus:

SQL> execute wait_test
scn: 13693141
Beendet
Elapsed: 00:00:49.98

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:
Schreibe einen Kommentar:
Themen:
datenbanken
Entweder einloggen... ...oder ohne Wartezeit registrieren
Benutzername
Passwort
Passwort wiederholen
E-Mail