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