ddl_lock_timeout parametresi hakkında

Oracle 11g öncesinde eğer bir tablo üzerinde bir DML komutu çalıştırılmış ve transaction sonlanmadan önce başka bir session tarafından yine bu tablo üzerinde bir DDL komutu çalıştırdığınızda oracle hiç beklemeden size “ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired” hatasını veriyor idi. Defaultta bu durum aslında 11g’ dede aynısı, test edelim ;

Üzerinde test yapabilmemiz için bir tane tablo create ediyoruz ;

SQL> create table k1 as select * from dba_tables
Table created.

Şimdi bu tablo üzerinden bir DML komutu çalıştırıp başka bir sessiondan DDL çalıştımayı deneyelim;

SQL>update k1 set owner =’TEST’ ;
2787 rows updated.

Şimdi ikinci bir sessiondan tabloyu truncate etmeye çalışıyorum ;

SQL>truncate table k1;
truncate table k1
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Elapsed: 00:00:00.12

Oracle komutu çalıştırır çalıştırmaz kaynak kullanımda olduğundan dolayı yapamazsın diye hatayı verdi.

Bu parametre ile artık şunu yapabiliyoruz, herhangi bir DDL komutu çalıştırdığımda eğer üzerinde işlem yapmaya çalıştığım tabloda bir lock durumu, kullanım durumu varsa XXX saniye kadar bekle yinede bu sürede DML tamamlanmaz ise işlemi yapamadan çık dememize yarıyor. Burada XXX ile belirttiğim süreyi saniye cinsinden verebiliyoruz ve bu değer 0 ile 1.000.000 saniye arasında bir değer alabiliyor. Bu aralık dışında bir değere set etmeye çalışırsanız aşağıdaki hatayı alırsınız. Bu arada 1.000.000 sn’ de yaklaşık 11,5 güne tekabül ediyor. Kim bu kadar bekler onuda merak etmemek mümkün değil 🙂

SQL>alter system set ddl_lock_timeout=10000001;
alter system set ddl_lock_timeout=10000001
*
ERROR at line 1:
ORA-00068: invalid value 10000001 for parameter ddl_lock_timeout, must be between 0 and 1000000

Bu değerimiz 10 sn olarak set edelim ve testimize devam edelim;

SQL>alter system set ddl_lock_timeout=10 ;
System altered.

Update komutumuzu çalıştıralım tekrar ;

SQL>update k1 set owner =’TEST’ ;
2787 rows updated.

Şimdi DDL komutumuzu basalım ;

SQL>truncate table k1;
truncate table k1
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
Elapsed: 00:00:10.04

10 saniye bekledi ama transaction hala sonlanmadığı için hata alıp çıktı. 10 sn içerisinde commit gelmiş olsaydı daha doğrusu transaction sonlanmış olsaydı truncate başarılı bir şekilde tamamlanmış olacaktı.

Bu parametre dinamik bir parametre olduığundan dolayı restart gerektirmeden session veya sistem bazında set edebilirsiniz.

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


yedi × 9 =