Montag, August 27, 2012

DDL_LOCK_TIMEOUT

Bei Tim Hall findet man ein interessantes Feature, das in Version 11.1 eingeführt wurde: das DDL_LOCK_TIMEOUT, mit dessen Hilfe man dem System eine Wartezeit angeben kann, ehe eine DDL-Operation den Fehler "ORA-00054: Ressource belegt und Anforderung mit NOWAIT angegeben oder Timeout abgelaufen" liefert:

-- Session 1:
SQL> create table t1 (id number);

Tabelle wurde erstellt.

SQL> insert into t1 (id) values (1);

1 Zeile wurde erstellt.


-- Session 2:
SQL> alter table t1 add constraint t1_pk primary key (id);
alter table t1 add constraint t1_pk primary key (id)
            *
FEHLER in Zeile 1:
ORA-00054: Ressource belegt und Anforderung mit NOWAIT angegeben oder Timeout abgelaufen

-- die PK-Anlage scheitert, weil Session 1 ein DML-Lock (TM)
-- im lmode 3 (Shared-Row Exclusive) für die Tabelle hält
-- wie man in v$lock sehen kann

SQL> ALTER SESSION SET ddl_lock_timeout=30;

Session wurde geändert.

SQL> alter table t1 add constraint t1_pk primary key (id);

-- Session wartet:
-- wenn Session 1 innerhalb von 30 sec ein commit oder ein rollback durchführt,
-- wird der Constraint in Session 2 erzeugt. Wenn nicht, dann tritt nach 30 sec 
-- der ORA-00054 auf

Tabelle wurde geändert.

Abgelaufen: 00:00:07.87

Nützlich ist diese Option z.B. dann, wenn man versucht DDL auf Objekten durchzuführen, die häufige Änderungen erleben, da sie die endlose Wiederholung erfolgloser Erzeugungsversuche verhindert. Der Parameter kann übrigens auch auf SYSTEM-Ebene (und maximal auf 1.000.000 sec) gesetzt werden.

Keine Kommentare:

Kommentar veröffentlichen