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;
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.