LOCK?
latch가 SGA를 보호한다면, lock은 database 전체를 보호한다.
태이블, 트랜잭션, 언두 세그먼트, 테이블 스페이스, 잡(job) 등 데이터 베이스 단위에서
피요한 대부분의 리소스들은 락의 보호를 필요로 하며 복잡하다.
간략히 정리해보면
1. 데이터베이스 내부에 정보가 존재하며, 락은 데이터베이스 레벨에서 작동한다. 2. 문맥 교환을 포함한 일련의 명령어를 사용하여 구현되어져 복잡하고 무겁다. 3. 트랜젝션 동안 지속된다. 4. 프로세스가 락 획득을 실패한후, 해당 요청은 queue로 관리되며, 요청한 순서대로 서비스된다. 단 nowait는 예외이다. 5. 6가지 모드로 요청이가능. [아래 표 참조] (null, row share, row exclusuve, share, share row exclusive, exclusive) *모드간의 호환성 관계 존재. [아래 표 참조] *매우 복잡한 작업에 대한 동기화 작업도 가능. |
LOCK 획득방식중 6가지 모드 표
모드 | 설명 |
0 | None |
1 | Null(N) |
2 | Sub-Shared(SS) 또는 Row-shared(RS) |
3 | Sub-Exclusive(SX) 또는 Row-Exclusive(RX) |
4 | Shared(S) |
5 | Shared-Sub-Exclusive(SSX) Shared-Row-Exclusive(SRX) |
6 | Exclusive(X) |
락 모드 호환성 표
N | SS | SX (RX) | S | SSX | X | |
N | ○ | ○ | ○ | ○ | ○ | ○ |
SS | ○ | ○ | ○ | ○ | ○ | X |
SX (RX) | ○ | ○ | ○ | X | X | X |
S | ○ | ○ | X | ○ | X | X |
SSX | ○ | ○ | X | X | X | X |
X | ○ | X | X | X | X | X |
*붉은 색 표시된 부분은 유심히 볼 필요가 있다.
LOCK의 기본적인 분류
Enqueue lock
enqueue 구조로 관리되는 lock이다. 오라클 10g부터 대부분 enqueue락에 대해 개별 대기 이벤트가 등록되므로 V$event_name 뷰를 조회하면 어떤 종류의 enqueue락이 존재하는지 알 수 있다.
enqueue lock이 보호하는 리소스(resource)의 형태는??
<<Resource = TYPE - ID1 - ID2 >> |
구분
user type lock : TX(트랜젝션), TM(테이블 리소스), UL(언두 세그먼트) system type lock : HW, US, CI, TC, SQ.... (V$EVENT_NAME로 확인 가능) *V$LOCK_TYPE 뷰 참조10g* |
일반 LCOK
enqueue lock이 아닌 일반락인 경우에는 별도의 리소스 구조체가 존재하지 않기때문에 이를 구분하기 위한 리소스 구분자도 없다.
또한 V$LOCK과 같은 통합뷰로도 볼 수 없다.
일반 락의 발생여부 및 경합 여부를 알수 있는 가장 좋은 방법은 V$SESSION_WAIT 뷰에서 대기현상이 발생하는지 관찰하는 것이다.
EX>
buffer lock 경합이 발생하면 buffer busy waits 와 read by other session 이벤트에 대한 대기현상이 발생한다. row cache lock 경합이 발생하면 row cache lock 대기현상 발생. library cache lock/pin 경합이 발생하면 library cache lock/pin 대기현상 발생. |
구분
row type lock library cache lock library cache pin buffer lock |
LOCK 획득 매카니즘
- (주)엑셈 practical OWI 15P 참조-
순서
1. Process A가 shared 모드로 락(lock)획득 시도 |
2. 해당 락을 점유한 프로세스가 존재하지 않으므로 Process A가 shared 모드로 락 획득하며 Process A를 보유프로세스 목록(OWNER LIST)에 등록 한다. |
3. Process W가 exclusive 모드로 락 획득 시도 |
4. Process A가 shared 모드로 락을 획득하고 있으므로 락 획득 실패하며 Process W는 대기 프로세스 목록에(Waiter list)에 등록 한다. |
5. 보유 프로세스목록에 등록되어 있는 프로세스가 작업을 완료(commit, roll back등)하면 대기프로세스 목록에 존재하는 다른 프로세스를 깨운다. |
6. 대기프로세스 목록에 등록된 프로세스는 타임아웃 시간이 경과 후에도 깨워주지 않으면 스스로 깨어나서 데드락(dead lock)이 발생했는지 여부를 확인 후 다시 대기 상태로 빠진다. |
타임 아웃
데드락을 피하기 위해 대기목록의 프로세스는 3초마다 깨어남 데드락 체크 후 다시 대기목록에 들어감 데드락이 확인 되면, 락 요청은 취소되고 현재 SQL문을 roll back 한다. |
타임 아웃 시간
enqueue lock : 3초 buffer lock : 일반 1초, 연속적으로는 3초 row cache lock : 60초 library cache lock / pin : 일반프로세스는 3초. PMON은 1초 |
(주)엑셈 practical OWI 15P를 참조
출처 : http://baind.tistory.com/entry/LOCK
'Database > Oracle' 카테고리의 다른 글
[펌] Lock 과 Latch 분류표 (0) | 2012.03.18 |
---|---|
[펌] Latch 란 무엇인가 (0) | 2012.03.18 |
[펌] Cursor 란?? (0) | 2012.03.18 |
[펌] Chunk 란? (0) | 2012.03.18 |
[펌] 라이브러리 캐쉬 구조 (0) | 2012.03.18 |