나. Row Cahce Lock
: 개별 Row Cache Object 를 보호하는 락
Dictionary 정보를 변경하려면 반드시 해당 Row Cache Object 에 대해
Row Cahce Lock 을 획득
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# ;
?