by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

row cache lock I




나. Row Cahce Lock
: 개별 Row Cache Object 를 보호하는 락
Dictionary 정보를 변경하려면 반드시 해당 Row Cache Object 에 대해
Row Cahce Lock 을 획득

[ Page 25 참조 ]

1. 세션 1 - DDL 명령어를 통해 오브젝트에 대한 딕셔너리 정보를 수정하기 위해 로우 캐시 락을 획보
2. 세션 1 - 로우 캐쉬 오브젝트에 접근하여 딕셔너리 정보를 수정
3. 세션 2 - 이 과정에서 다른 세션에서 동일 오브젝트에 대한 딕셔너리 정보를
수정하려고 시도하면 로우 캐쉬 락을 획득하지 못해 대기하게 됨

V$SESSION_WAIT View
P1 = cache#, V$ROWCACHE.CACHE# 과 JOIN
P2 = mode, LOCK 획득 mode
P3 = request. Lock 요청 mode

SQL> select h.address, h.saddr, s.sid, h.lock_mode , h.lock_request
from v$rowcache_parent h, v$rowcache_parent w, v$session s
where h.address = w.address
and w.saddr = (select saddr from v$session where event = 'row cache lock' and rownum = 1)
and h.saddr = s.saddr
– and h.lock_mode > 0 ; – Holder, Waiter
and h.lock_request > 0

SQL> select h.address, h.saddr, s.sid, h.lock_mode,
A.P1, A.P1RAW, A.P2, A.P2TEXT, A.P3, A.P3TEXT,
S.EVENT, S.STATUS, C.TYPE, C.PARAMETER
from v$rowcache_parent h, v$rowcache_parent w,
v$session s , v$session_wait A, V$ROWCACHE C,
(select SID, SEQ#, saddr from v$session where event = 'row cache lock' And rownum = 1) Z
where h.address = w.address
and w.saddr = Z.saddr
and h.saddr = s.saddr
and h.lock_mode > 0
and Z.SID = A.SID
AND Z.SEQ# = A.SEQ#
AND A.P1 = C.CACHE# ;

Row Cache Lock 경합
NOCACHE 속성의 Sequence
NEXTVAL 호출 때마다 Dictionary 변경필요
Row Cache Lock 을 SRX(5) Mode 로 획득 ? 경합 발생
Sequence 생성시 1) 가능한 CACEH 속성 부여 2) 동시 사용 SESSION 수가 많으면 10,000 이상의 큰 값 부여
동시에 많은 Session 이 동일 Row Cache Object 변경 할 때 항상 발생 가능

( TEST )

SQL> create sequence s1 nocache;
Sequence created.

SQL> !vi temp.sql
dclare
v_value number;
begin
for idx in 1 .. 100000 loop
select s1.nextval into v_value from dual;
end loop;
end;
/

세션1) SQL>@temp.sql
세션2) SQL>@temp.sql

SQL> select h.address, h.saddr, s.sid, h.lock_mode,
A.P1, A.P1RAW, A.P2, A.P2TEXT, A.P3, A.P3TEXT,
S.EVENT, S.STATUS, C.TYPE, C.PARAMETER
from v$rowcache_parent h, v$rowcache_parent w,
v$session s , v$session_wait A, V$ROWCACHE C,
(select SID, SEQ#, saddr from v$session where event = 'row cache lock' And rownum = 1) Z
where h.address = w.address
and w.saddr = Z.saddr
and h.saddr = s.saddr
and h.lock_mode > 0
and Z.SID = A.SID
AND Z.SEQ# = A.SEQ#
AND A.P1 = C.CACHE# ;
?

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.