1. row cache lock
오라클은 딕셔너리의 정보를 SGA 내의 Row Cache (혹은 Dictionary Cache) 영역에 저장하고 있다.
Row Cache 는 Shared Pool 영역에 존재하며 다음과 같은 쿼리로 확인할 수 있다.
SQL> select pool, name, bytes from v$sgastat
2 where name = 'row cache' ;
딕셔너리의 내용을 변경하고자 하는 프로세스는 그에 해당하는 row cache object 에 대해서 row cache lock 을 획득해야 한다.
대표적인 경우가 시퀀스 (Sequence) 인데, 시퀀스의 nextval 을 획득하는 과정에서 딕셔너리 정보의 변경이 필요한 경우에
시퀀스에 해당하는 row cache object 에 대해서 row cache lock 을 SSX (Shared Sub-Exclusive) 모드로 획득해야 한다.
Row Cache Lock 은 Enqueue 구조를 사용하지 않으며 row cache object 정보 안에 존재하는 락 보유목록 (Owner list) 과
락 대기 목록 (Waiter list) 을 통해 블로킹 메커니즘을 구현한다.
2. enq: SQ - contention, DFS lock handle (SV)
오라클은 시퀀스를 관리하기 위해 세가지 락을 사용한다.
- row cache lock : Sequence.nextval 을 호출하는 과정에서 딕셔너리 정보를 물리적으로 변경하는 경우에 획득한다.
NOCACHE 속성을 부여한 시퀀스에서 사용된다.
- SQ 락 : 메모리에 캐시되어 있는 범위안에서 Sequence.nextval 을 호출하는 동안 획득한다.
CACHE 속성을 부여한 시퀀스에서 사용된다.
- SV 락 : RAC 에서 노드간에 순서가 보장된 상태로 Sequence.nextval 을 호출하는 동안 획득한다.
CACHE + ORDER 속성을 부여한 시퀀스에서 사용된다.