Tuesday, May 18, 2010

v$LOCK kullanımı

-- v$LOCK kullanımı --

v$lock view'ı bir instance'da
- Elinde lock tutan sessionları hemde
- Bir objeye veya satıra erişim için lock bekleyen ( blocklanan sessinları ) gösterir.

Bu view'de

LMODE kolonu elinde lock tutan session'ın lock modunu
REQUEST ise lock isteyen session'ın lock modunu gösterir.
SID : lock isteyen veya lock tutatn session id sidir.
TYPE : Lock tipidir. TX ; transaction lock'dır ( Update,insert,delete ) ile görülür
TM : Obir obje üzerinde işlem yapıldığında objenin değişmesini engellemek için konulan bir lock türüdür.

Bunların dışındaki lock'lar ise sistem tarafından kısa süreli konulur.

ID1 ve ID2 ise lock türüne göre değişir. Aşağıdaki örneklerle açıklanmıştır.

-- Örnet bir çalışma --
Create table deneme ( a number );

SQL> select distinct sid from v$mystat;

SID
----------
16592

SQL> select * from v$lock where sid = 16592;

no rows selected



SQL> insert into deneme values (1);

1 row created.

SQL> select * from v$lock where sid = 16592;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
000000096F418A88 000000096F418C00 16592 TX 242679855 39672 6 0 10 0
00000009989B1598 00000009989B15C0 16592 TM 3853562 0 3 0 7 0


Burada TX lock ; Transaction lock anlamına gelir ve
The ID1 and ID2 columns point to the rollback segment and transaction table entries for that transaction.
TX lock aynı kaydın update edilmesine mani olur.

TM lock ise;
The TM lock is a DML lock. It's acquired once for each object that's being changed.
The ID1 column identifies the object being modified.

İlgili objenin change edilmesine mani olur. Örneğin şu anda tabloya add column yapılmasına mani olur.

Burada LMODE lock'ın tutulduğu anlamına gelir. Bu insert ile 16592 nolu session
3853562 nolu objeye TM lock ve 242679855 , 39672 transactionn 'ına execulise lock koymuştur.
Seviye 6 en yüksek seviyedir kesinlikle o obje veya satıra erişimi engeller.


SQL> commit;

Commit complete.

SQL> select * from v$lock where sid = 16592;

no rows selected

SQL> update deneme set a=2 where a=1;

1 row updated.

SQL> select * from v$lock where sid = 16592;

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
000000096F418A88 000000096F418C00 16592 TX 210108434 47383 6 0 8 0
00000009989B5090 00000009989B50B8 16592 TM 3853562 0 3 0 4 0

Burada bir update vardır. Yukarıdaki gibi kullanıcı TX ve TM locklarını koymuştur.
Burada 14240 nolu session'da aynı update 'i yaptığında - update deneme set a=2 where a=1; --

Aşağıdaki durum ortaya çıkar.

Burada BLOCK =1 'in anlamı 16592 nolu session'ın başka bir session'ı blockladığını gösterir.
Blocklanan session ise transaction bilgilerinden bulunur. Lock isteyen session ile ( Request > 0 olmalıdır )
Lock'ı tutan session'ın ID1 ve ID2 değerleri eşit olmalıdır . ( Aynı Rollback segment ve transaction table entries olmalıdır )

Burada request 'in 0 'dan büyük olması ilgili session bir tablo üzerinde lock istediği anlamına gelir.
6 değeri en büyük değerdir ve exclusive'dir.


SQL> select * from v$lock where sid in (14240,16592);

ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00000009989AE560 00000009989AE588 14240 TM 3853562 0 3 0 42 0
00000009889CDF30 00000009889CDF50 14240 TX 210108434 47383 0 6 41 0
000000096F418A88 000000096F418C00 16592 TX 210108434 47383 6 0 95 1
00000009989B5090 00000009989B50B8 16592 TM 3853562 0 3 0 94 0


Bir instance'da lock alıp diğerlerinin lock almasını bekleten tüm sessionlar

select * from v$lock where BLOCK = 1 ile kolayca bulunur.