search
Giriş
Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın Türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi
0 oy
940 gösterim
Oracle üzerinde lock oluştuğunu nasıl anlarım?

Oluşan lockları listelemek için bir komut var mı?
Veri Tabanı kategorisinde 6.2k puan

1 cevap

1 oy

Lock'lar  aynı veri üzerinde aynı anda farklı kişilerin işlem yapmasını engelleyen böylelikle veritabanı sisteminde veri tutarlılığını sağlayan çok önemli bir mekanizmadır.  

Lockları kendi içerisinde satır bazlı (row lock) ve tablo bazlı(table lock) olmak üzere ikiye ayırabiliriz.  Oracle Tablo bazlı lock'ları kendi içerisinde de yine gruplamıştır.  Detaylı olarak bu linkten isterseniz inceleyebilirsiniz.

Veritabanı sisteminde bir nesne veya veri üzerinde  oluşan lock başkasını engellemediği sürece aslında lock'ları çok severiz. Kimse farkına bile varmaz.  Böyle bir kavramın olduğundan haberi de yoktur belki. Lakin, ne zaman bu lock başkasının iş yapmasını engellese o zaman "hasscript noluyor :)"  demeye başlanır.   

Bunu örnekle anlatacak olursak;  birileri  bir tabloda bir kayıt üzerinde güncelleme yaptı.  O güncelleme işlemi Commit veya Rollback ile sonlanmadığı sürece başka birisi aynı kayıt üzerinde herhangi bir işlem yapamayacaktır. çünkü o kayıt artık o session tarafından lock'lanmıştır. Bu satır bazlı bir kilitlenmedir. Başka birisi işlem yapmaya çalıştığında, bu session onu bloklayacaktır.  

--session 1  

SQL> update  deneme set tarih=sysdate where id=3;

1 row updated.

--1.session'daki update işlemi henüz commit'lenmedi.

--2. başka bir session'dan aynı komut geldi.  1.session commitlemediği için bu komut sonlanmayacak, 1. session'ın bu tablo üzerindeki lock'ı kaldırmasını bekleyecektir. 

SQL> update  deneme set tarih=sysdate where id=3;

...waiting...

Böyle bir durumda ,  bu işlem arka planda uzun sürdüğü için mi bekliyoruz, yoksa bu tablo üzerinde bir lock var da onu mu bekliyoruz onu öğrenmek için aşağıdaki komutu kullanabiliriz.


SELECT a.owner,
       a.object_name,
       a.object_type,
       b.locked_mode l_m,
       b.oracle_username username,
       b.session_id SID,
       s.machine,
       s.program,
       s.osuser,
       b.process pid,
       'ALTER SYSTEM KILL SESSION ''' || s.SID || ',' || s.serial# || ''';'
          kill_statement
  FROM dba_objects a, v$locked_object b, v$session s
 WHERE a.object_id = b.object_id AND b.session_id = s.SID;

--AND a.object_name LIKE 'TABLE_NAME%';

Bu komut size üzerinde lock olan nesneleri gösterecektir.

Örnek çıktısı aşağıdaki gibi olacaktır;

OWNER    OJECT_NAME    OBJECT_TYPE    L_M    USERNAME    SID        MACHINE                        PROGRAM                            OSUSER    PID        KILL_STATEMENT
HS        DENEME        TABLE        3    SYS            1164    linuxserver.domain.com    [email protected]    oracle  7354    ALTER SYSTEM KILL SESSION '1164,63027';

Burdan lock var mı, var ise kim tarafından olmuş, hatta benim eklediğim ilgili session'ı kill etmek için son kolondaki kill etme scriptini görebilirsiniz.

Ayrıca yine bloklanan ve bloklayan sessionları görmek için aşağıdaki faydalı scripti de kullanabilirsiniz.

SELECT DECODE (l.BLOCK, 0, 'Waiting', 'Blocking ->') user_status,
         CHR (39) || s.SID || ',' || s.serial# || CHR (39) sid_serial,
         (SELECT instance_name
            FROM gv$instance
           WHERE inst_id = l.inst_id)
            conn_instance,
         s.SID,
         s.PROGRAM,
         s.osuser,
         s.machine,
         DECODE (l.TYPE,
                 'RT', 'Redo Log Buffer',
                 'TD', 'Dictionary',
                 'TM', 'DML',
                 'TS', 'Temp Segments',
                 'TX', 'Transaction',
                 'UL', 'User',
                 'RW', 'Row Wait',
                 l.TYPE)
            lock_type                                                   --,id1
                     --,id2
         ,
         DECODE (l.lmode,
                 0, 'None',
                 1, 'Null',
                 2, 'Row Share',
                 3, 'Row Excl.',
                 4, 'Share',
                 5, 'S/Row Excl.',
                 6, 'Exclusive',
                 LTRIM (TO_CHAR (lmode, '990')))
            lock_mode,
         ctime,
         object_name
    FROM gv$lock l
         JOIN gv$session s ON (l.inst_id = s.inst_id AND l.SID = s.SID)
         JOIN gv$locked_object o
            ON (o.inst_id = s.inst_id AND s.SID = o.session_id)
         JOIN dba_objects d ON (d.object_id = o.object_id)
   WHERE (l.id1, l.id2, l.TYPE) IN (SELECT id1, id2, TYPE
                                      FROM gv$lock
                                     WHERE request > 0)
ORDER BY id1, id2, ctime DESC;

604 puan

İlgili sorular

0 oy
1 cevap 239 gösterim
239 gösterim
Oracle'da bir iş yaparken sanıoyrum lock oluştu. Kayıt yapamıyorum, silemiyorum. İşlemi sonlandırmada da sorun çıkıyor, devam da etmiyor sanıyorum. Bu işlemi nasıl sonlandırıp rollback yaparım?
13 Aralık 2016 Veri Tabanı kategorisinde kenan 6.2k puan sordu
0 oy
0 cevap 370 gösterim
370 gösterim
Oracle DB'de TPS (Transaction Per Second) ne anlama geliyor? DB'deki TPS değerini nasıl görebiliriz?
30 Kasım 2020 Veri Tabanı kategorisinde buzel 604 puan sordu
0 oy
1 cevap 443 gösterim
443 gösterim
Elimde CUSTOMER tablosu var ve bunun için rastgele 20 veriyi nasıl getiririm ?
28 Ocak 2020 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu
0 oy
1 cevap 620 gösterim
620 gösterim
Oracle DB'de varchar2 bir alanı clob'a nasıl çeviririm?
28 Mayıs 2019 Veri Tabanı kategorisinde sinan 291 puan sordu
0 oy
1 cevap 999 gösterim
999 gösterim
Bir dosyadan küsürlü bir sayı almaya çalışyorum. Ancak bazı sayıların sonunda nokta olabiliyor. Bunları nasıl ayırabilirim? örn: "46440.0" değil de "46440."
15 Mayıs 2019 Veri Tabanı kategorisinde tolgacelik.art 2.0k puan sordu