Blog ' da Ara

Loading

22 Ağustos 2011

ORACLE LOCK YÖNETİMİ


                Bir DML işlemi çalışırken, başka bir dml işleminin aynı data üzerinde etki etmesini öznleme mekanizmasına Oracle Lock Mekanizması denebilir. Şekil 1 de bu durum simgelenmeye çalışılmıştır.
Şekil 1: Oracle Row Lock

                Transactionlar dataları row seviyesinde yada tüm bir tablo seviyesinde lock layabilirler. Bu durum çakışma olmaması için manuel sağlanabileceği gibi otomatik olarak da sağlanabilir.Locking oracle tarafından yapıldığında mümkün olan en az data locklanacak ve potansiye laçkışma riski azaltılmış hatta yok edilmiş olacak.

 
                Öyleyse lock mekanizmasını aşağıdaki gibi tanımlayabiliriz.
·         Dml işlemleri için Row-level lock,
·         Otomatik enqueue( sırlama/kuyruk ) yönetimi,
·         DML işleminin rollback yada commit ile sonlandırılana kadar lock halinin sürdürülmesi.
                Row-level lock yukarıda bahsettiğimiz gibi DML işlemi yapılırken ilgili row 'un sağlıklı bir şekilde işlem sonuna kadar yeni bir dml işlemi için izin verilmemesi. Enqueue ise bu gibi durumlarda başlatılan yeni dml işlemlerinin sıraya konması ve lock gerçekleştirilen dml işlemi commit yada rollback ile bittiğinde işleme alınması.
                Oracle default lock model row-level lock mekanizmasıdır.Ancak Manuel olarak daha yüksek seviyede locklama yapılabilir.Aşağıdaki script tablo yu locklamaktadır.
                LOCK TABLE HR.EMPLOYEES IN EXCLUSIVE MODE;
·         EXCLUSIVE: Bu opsiyon tüm tabloyu locklar ve tablonun herhangi bir row u dahi update edilmez lock 'ın sona erdirilmesi gerekmektedir.(sadece okumaya izin verir)
·         ROW SHARE:Tablo ya çoklu erişimlere izin verir ancak tablonun tamamının locklanmasına izin vermez.(okumaya ve dml işlemlerine izin verir)
·         ROW EXCLUSIVE:Row share ile aynı özelliklere sahip olması ile birlikte share modda lock yapılmasını engeller.Oracle Default lock mekanizmasıdır.DML işlemlerinde oracle row-level lock için bu metodu kullanır.
·         SHARE: Tabloya çoklu erişime izin verir ancak tablo üzerinde herhangi bir DML işlem çalışmasına izin vermez. İnex oluştururken bu metod kullanılır.(sadece okumya izi verir)
·         SHARE ROW EXLUSIVE:Tablonun tamamının okunmasında sakınca yoktur ancak başka userlar tarafından tablonun locklanmasını engeller ve dml işlemlerinede izin vermez.
                Bu komutlarla birlikte NOWAIT parametreside kullanılırsa eğer bu tabloları locklamak isteyen bir user olursa onları bekletmek yerine hata dönerek kontrolun userlarda olmasını sağlayacaktır.
                Bir oracle veritabanında verinin locklanması 3 sebepten dolayı olabilir.Commit lenmemiş bir değişiklik, Uzun süren transactionlar yada gereksiz yere tüm tablonun locklanması.Bu gibi durumlarda dba nın yapması gereken lock oluşturan user 'a ulaşıp bilgi almak işlemi sonuçlandırması yönünde hatırlatmada bulunmak yada sessionu kill etmektir. Ancak dikkat edilmelidir ki , eğer bir session kill olursa yapılan tüm çalışmalar rollback yapılmış olur.Bu konuda ilgili session sahibinin bilgisi olmalıdır.
                Blokeye sebep olan sessionlar enterprise managerda görüntülenebilir (şekil 2 ) yada aşağıdaki gibi bir scriptle tespit edelebilinir. Örnekte hr.employees tablosu SYS user tarafından locklanmış ve hr user tarafından da dml yapılmak istenmiştir.
Şekil 2: Blocking Session
Hatta aşağıdaki script ile herhangi bir tablo üzerinde lock olup olmadığını bile sotgulayabilriiz.
  SELECT   s.inst_id,
           l.SID,
           s.serial#,
           l.TYPE,
           d.object_name,
           s.username blocking_session,
           s.osuser,
           l.LMODE
    FROM   gv$lock l, dba_objects d, gv$session s
   WHERE       d.object_id = l.id1
           AND s.SID = l.SID
           AND s.inst_id = l.inst_id
           --AND o.object_name LIKE UPPER ('%EMPLOYEES%')
ORDER BY   inst_id;
Bu query nin çıktısı aşağıdaki gibi olacaktır

 Şekil 3 : Blocking session query
               
                Dead Lock; Dead lock oracle lock mekanizmasının farklı bir çeşidi olarak karşımıza çıkar. Eğer bir veri bir session tarafından locklanmış sa ve birden çok session tarafından bekleniyorsa, bu tip lock olayına dead lock denir.Oracle veritabanı dead lock ları tespit ederek statementlerişn hata ile sonlandırılmasını sağlar.Bu durumda bekleyen sessionlar dml işlemlerini tamamlayabilirler.
                                                                               Özcan YILDIRIM

2 yorum:

  1. Çok teşekkürler.

    YanıtlaSil
  2. Elinize saglık hocam çok yararlı oldu

    YanıtlaSil

"Sorularınız ve Eleştirileriniz Değerlidir"