래치와 락의 차이점을 집중적으로 들어가기에 앞서 가볍게 래치와 락의 차이를 알아보자.
분류 | 래치(LATCH) | 락(LOCK) |
목적 | 하나의 목적을 수행함 : 메모리 구조에 대한 배타적인 접근을 위함 (오라클 9i부터 cache buffers chains latch 들은 읽기 전용시에 공유가 가능함) -거의 독점적- |
두가지 목적을 수행함 : 락 모드가 호환 가능하면 다수의 프로세스가 동일한 리소스를 공유하는 것을 허용하며, 락 모드가 호환 가능하지 않으면 리소스에 대한 배타적인 접근만 허용함 (공유lock이 많음) |
사용범위 | sga내부의 데이터 구조에만 적용. 메모리 오브젝트를 임시적으로 보호함. 단일 오퍼레이션으로 메모리 구조에 대한 접근 제어. 트랜잭션 단위가 아님. |
테이블, 데이터 블록 및 state object와 같은 오브젝트를 보호함. 데이터베이스의 데이터 또는 메타데이터 접근제어. 트랜잭션 단위 |
획득방식 | 두가지 모드로 요청이 가능 willing-to-wait 또는 no-wait |
6가지 모드로 요청가능 : null, row share, row exclusive, share, share row exclusive, 또는 exclusive 아래 표 참조. |
범위 | sga내부에 정보가 존재하며, 로컬 인스턴스에만 볼 수 있음. - 인스턴스 레벨로 작동- |
데이터베이스 내부에 정보가 존재하며, 모든 인스턴스에서 볼 수 있음. lock은 데이터 베이스 레벨에서 작동. |
복잡도 | 단순한 명령어를 사용하여 구현됨. 일반적으로 test-and-set, compare-and-swap 또는 단순한 cpu명령어. 구현이 쉬움 |
문맥 교환(context switch)을 포함한 일련의 명령어들을 사용하여 구현됨. 구현이 복잡하다. |
지속기간 | 짧은 순간만 지속됨 (microsecond단위) = 100만분의 1초 |
일정시간동안 지속 (트랜잭션 동안) |
큐(Queue) | 프로세스가 래치 획득을 실패 한 후 슬립(sleep) 상태로 들어갈 때, 해당 요청은 큐(queue)로 관리되지 않으며, 요청한 순서대로 서비스 되지않음 (latch wait list를 이용하여 큐방식으로 사용되는 래치들은 예외) |
프로세스가 락 획득을 실패한 후, 해당 요청은 큐(queue)로 관리되며, 요청한 순서대로 서비스됨(nowait 모드는 예외) |
데드락(DEADLOCK) | 데드락이 발생되지 않도록 구현됨 (레벨방식) |
락은 큐 방식을 사용하며, 데드락이 발생될 가능성이 높다. 데드락이 발생 될 때마다 트레이스 파일이 생성된다. |
참조 : 조동욱님 OWI책 P49
LOCK 획득방식중 6가지 모드 표
참조 : 조동욱님 OWI책 P70
출처 : http://baind.tistory.com/entry/LATCH-와-LOCK-분류표
모드 | 설명 |
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) |
참조 : 조동욱님 OWI책 P70
출처 : http://baind.tistory.com/entry/LATCH-와-LOCK-분류표
'Database > Oracle' 카테고리의 다른 글
[펌] granularity 란? (0) | 2012.03.18 |
---|---|
[펌] cardinality 란? (0) | 2012.03.18 |
[펌] Latch 란 무엇인가 (0) | 2012.03.18 |
[펌] Lock 개요 (0) | 2012.03.18 |
[펌] Cursor 란?? (0) | 2012.03.18 |