Pages

18 Nisan 2011 Pazartesi

V$ACCESS görünümü kullanarak kilit tutan objelerin tespiti üzerine bir inceleme

Geçtiğimiz günlerde OTN’de bir soru ve cevabı dikkatimi çekti. Soru;”V$ACCESS görünümü kullanarak kilitli objelerin tespit edilmesi” ile ilgiliydi ve cevap veren gurulardan birisinin cevabı V$ACCESS görünümü ile kilitli objelerin görülemeyeceği şeklindeydi. V$ACCESS görünümünü daha önceden bende kilit tutan objelerin tespitinde kullanılır diye bildiğimden, bu cevap hakkında kafamda kuşkular oluştu. Aslında V$LOCKED_OBJECTS gibi bir görünüm daha fazla kilit hakkında bilgi tuttuğu için benimde tercihim olmasına rağmen, bu cevap ile ilgili bugün test ortamında bir deneme yaptım ve sonucunu bu yazı ile paylaşıyorum.

Oracle dökümanlarında V$ACCESS hakkında bulduğum bir paragraf;

"V$ACCESS görünümü, library cache üzerinde mevcut durumda uygulamaya girmiş kilitler hakkında bilgi vermektedir."

V$ACCESS görünümü oturumlar tarafından belirli instance için library cache seviyesinde hangi objelerin erişim erişim yaptığı ve kilit tuttuğu ile ilgili bilgi vermektedir. Bu görünüm kilit tutulup tutulmadığı ile ilgili bilgi içermez. Aşağıdaki örnekte test1 ve scott adlı 2 farklı oturumdan işlemler yapacağım ve V$ACCESS görünümü bilgilerini alacağım.


1. oturum:
SQL> conn test1/Pa$$word1 as sysdba
SQL> select owner,type,count(*)
  2  from v$access
  3  where owner='SCOTT'
  4  group by owner,type;

no rows selected


2. oturum:
SQL> conn scott/tiger
SQL> desc emp

 Name         Null?    Type
 ----------- -------- --------
 EMPNO       NOT NULL NUMBER(4)
 ENAME                VARCHAR2(10)
 JOB                  VARCHAR2(9)
 MGR                  NUMBER(4)
 HIREDATE             DATE
 SAL                  NUMBER(7,2)
 COMM                 NUMBER(7,2)
 DEPTNO               NUMBER(2)

SQL> select * from emp where rownum < 2;


EMPNO ENAME   JOB    MGR   HIREDATE  SAL    COMM   DEPTNO
----- ------  -----  ----- --------- ------ ------ ------
7369  SMITH   CLERK  7902  17-DEC-80  800          20
       


1. oturum:
SQL> select owner,type,count(*)
  2  from v$access
  3  where owner='SCOTT'
  4  group by owner,type;

OWNER    TYPE    COUNT(*)
-------- ------- ---------
SCOTT    TABLE   1


Yukardaki obje şuan 2. oturumun yaptığı işlem sonunda library cache içerisine yüklenmiştir.

SQL> grant all on emp to public;

Grant succeeded.

SQL> update emp
  2  set sal=sal+1000
  3  where empno=7369;

1 row updated.

Yukardaki UPDATE işlemi sonunda henüz COMMIT işlemi yapmıyorum.
3. oturum:
$ sqlplus / as sysdba

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> update scott.emp set sal=sal-100 where empno=7369;


Yukarda 3. oturum sonunda 1. oturumdan neler olduğuna bir bakalım.


SQL> select * from v$access where object='EMP';

SID OWNER   OBJECT   TYPE
--- ------- -------- --------
25  SCOTT   EMP      TABLE
24  SCOTT   EMP      TABLE

Yukardaki örnekte görüldüğü üzere, V$ACCESS görünümü üzerinden hangi oturumun library cache içinden hangi objeye o anda erişim yaptığı bilgisi alınmaktadır. 25 ve 24 SID numaralı oturumların her ikiside aynı objedeki satırı değiştirmektedir, ancak hangisinin bekleyen, hangisinin bloklayan olduğu hakkında bir bilgi yoktur. Bu anda eğer V$LOCKED_OBJECTS görünümüne bakarsanız daha detaylı bilgiyi bulabilirsiniz.  

0 yorum:

Yorum Gönder