Lock과 Latch의 차이점에 대해 고민해보신 적이 있으신가요?
Oracle에서 Lock과 Latch는 모두 동시성 제어(Concurrency Control)를 위한 메커니즘이지만, 목적·범위·레벨이 다릅니다.
둘 다 경쟁 조건(Race Condition)을 방지하기 위한 보호 장치지만, 작동하는 레이어가 완전히 다릅니다.
한 번 비교해서 살펴봅시다.
요약. Lock vs Latch 비교 정리
| 구분 | Lock | Latch |
| 목적 | 트랜잭션 간 데이터 무결성 유지 | 내부 메모리 구조 보호 |
| 보호 대상 | 테이블, 행, 세그먼트 등 DB 오브젝트 | SGA 내 공유 메모리 구조체 |
| 유지 시간 | 트랜잭션 지속 시간 동안 | 매우 짧은 시간 (작업 완료 즉시) |
| 대기 유형 | enqueue wait (TX, TM 등) | latch free wait event |
| 조회 뷰 | V$LOCK, DBA_BLOCKERS | V$LATCH, V$LATCH_CHILDREN |
| 예시 | TX Lock, TM Lock | cache buffers chains latch |
| 주체 | 서버 프로세스(Server Process) | Oracle 커널 내부 코드 |
1. Lock (락)
개념
Lock은 데이터 무결성(Data Integrity)을 보장하기 위해 데이터베이스 오브젝트 수준에서 트랜잭션 간 접근을 제어하는 메커니즘입니다.
→ 즉, 사용자 트랜잭션 단위의 동시성 제어입니다.
Enqueue
Enqueue는 Oracle에서 Lock을 구현하기 위한 내부 동기화 메커니즘입니다.
즉, 우리가 흔히 말하는 "Lock"은 논리적 개념이고,
Enqueue는 실제로 Lock을 구현하는 커널 레벨 객체입니다.
Enqueue의 구성 요소
| 항목 | 설명 |
| Type (2바이트 코드) | Enqueue 종류 (예: TX, TM 등) |
| ID1 / ID2 | Lock 대상 자원 식별자 (예: 세션 ID, 오브젝트 ID 등) |
| Mode | Lock 모드 (예: X, S, RS, RX 등 — Shared / Exclusive 등) |
| State | Held / Requested 상태 |
| Session / Process | Enqueue를 보유 중인 세션 정보 |
대표적인 Lock 종류(Enqueue Type)
| Enqueue Type | 설명 | 발생 상황 | 관련 뷰 |
| TX (Transaction) | 트랜잭션 락 | Row-Level Lock, Commit/Undo 관리 | V$LOCK |
| TM (DML Table) | 테이블 락 | DML 수행 중 테이블 보호 | V$LOCK |
| UL (User Lock) | 사용자 정의 락 | DBMS_LOCK 사용 시 | V$LOCK |
| SQ (Sequence) | 시퀀스 객체 보호 | Sequence 값 증가 시 | V$LOCK |
| ST (Space Transaction) | 공간 관리 | Temp Segment 확장 중 | V$LOCK |
| HW (High Water Mark) | 세그먼트 확장 보호 | INSERT 시 HWM 이동 | V$LOCK |
| CF (Control File) | 컨트롤 파일 변경 보호 | DB open, checkpoint | V$LOCK |
| DL (Direct Loader) | Direct Path Insert 보호 | Direct Path Insert 시 | V$LOCK |
| RT (Redo Thread) | 리두 로그 스레드 보호 | Log Switch, Checkpoint | V$LOCK |
| LB (Library Cache) | 라이브러리 캐시 보호 | SQL/PLSQL Parse 시 | V$LOCK |
| RS (Result Cache) | 결과 캐시 보호 | Result Cache 사용 시 | V$LOCK |
| TT (Temp Table) | 임시 테이블 보호 | Temporary Table 사용 시 | V$LOCK |
Lock Mode (Enqueue Mode)
| Mode 번호 | Mode 이름 | 설명 |
| 0 | None | Lock 없음 |
| 1 | Null (N) | 예약된 Lock (정보용) |
| 2 | Sub-Shared (SS) | 부분 공유 |
| 3 | Shared (S) | 읽기 공유 |
| 4 | Exclusive (X) | 쓰기 독점 |
| 5 | Shared-Sub-Exclusive (SSX) | 복합 모드 |
| 6 | Exclusive (X) | 완전 배타적 접근 |
1. 세션이 데이터 자원을 변경하려고 하면, 해당 자원에 대해 Enqueue 요청 발생
2. 이미 다른 세션이 동일 자원을 Exclusive 모드로 보유 중이라면,
→ 요청 세션은 대기 상태(wait)로 전환 (enqueue wait 이벤트 발생)
3. 자원이 해제되면, Oracle은 대기 중인 세션에게 Enqueue를 부여
Enqueue Wait Event 예시
| Wait Event | 의미 |
| enq: TX - row lock contention | 다른 트랜잭션이 Row-level Lock 보유 중 |
| enq: TM - contention | DML/DDL 충돌로 인한 테이블 락 대기 |
| enq: HW - contention | High Water Mark 확장 경합 |
| enq: CF - contention | Control File 접근 경합 |
| enq: SQ - contention | Sequence 접근 경합 |
특징
| 항목 | 설명 |
| 보호 대상 | 테이블, 행(Row), 인덱스, 세그먼트 등 데이터베이스 오브젝트 |
| 주체 | 서버 프로세스(Server Process) |
| 동작 시점 | 트랜잭션이 데이터에 접근할 때 (DML/DDL 수행 시) |
| 지속 시간 | 트랜잭션 커밋(Commit) 또는 롤백(Rollback) 시까지 유지 |
| 예시 | TX Lock (트랜잭션 락), TM Lock (테이블 락), DDL Lock, Library Cache Lock 등 |
| 조회 뷰 | V$LOCK, DBA_BLOCKERS, DBA_WAITERS, V$SESSION 등 |
동작 예시
- TX Lock: 특정 Row가 다른 세션에 의해 수정 중일 때, 다른 세션은 대기 상태로 전환됨 (Row-level Lock)
- TM Lock: DML 중인 테이블에 다른 세션이 DDL(예: DROP, ALTER)을 시도할 때 충돌 방지
2. Latch (래치)
개념
Latch는 Oracle 내부 메모리 구조(SGA, Shared Pool, Buffer Cache 등)에 대한 짧은 기간의 보호(Synchronization primitive)를 제공합니다.
→ 즉, 시스템 레벨(메모리 구조)의 동시 접근 제어입니다.
Latch Spinning
Latch를 획득하려는 프로세스가 있을 때, 이미 다른 프로세스가 해당 latch를 보유 중이면,
Oracle은 단순히 기다리지 않고 아주 짧은 시간 동안 CPU를 사용해서 latch가 풀릴 때까지 재시도(spin) 합니다.
이 과정을 "Latch Spinning"이라고 부릅니다.
(짧은 점유 시간(latch hold time)을 전제로 설계된 낙관적 대기(Optimistic Wait) 방식입니다)
낙관적 대기(Optimistic Wait) : 다른 사용자가 데이터를 변경하지 않을 거라 낙관적으로 생각
1. 프로세스가 latch를 획득하려고 시도
2. latch가 이미 다른 프로세스에 의해 점유 중이라면 → 바로 sleep하지 않음
3. CPU에서 지정된 횟수만큼 반복(spin)하며 latch 획득을 재시도
- 만약 그 짧은 시간 내 latch가 해제되면 → latch 획득 성공
- 그래도 해제되지 않으면 → sleep 상태로 진입 (OS 수준 대기)
_SPIN_COUNT : latch 획득 시 몇 번 반복(spin)할지를 제어하는 오라클 히든 파라미터
Spinning은 CPU를 사용하지만,
잠깐 기다리면 latch가 곧 풀릴 것이라면 sleep(대기)하는 것보다 훨씬 빠릅니다.
latch를 획득하지 못해 결국 sleep 상태로 진입하게 되는 것은
단일 세션이 오랜 시간 동안 latch를 보유해서라기보다는
많은 세션이 동시에 동일 latch를 원하고 각 세션이 짧은 시간동안 latch를 보유하기 때문에 발생하는 문제입니다.
latch는 추천운에 기초해 랜덤하게 할당됩니다.
어느 세션이나 latch가 해제된 다음 곧바로 latch를 요청하면 얻을 수 있습니다.
특징
| 항목 | 설명 |
| 보호 대상 | SGA 내부의 공유 메모리 구조체 (예: 버퍼 캐시 해시 체인, 라이브러리 캐시 등) |
| 주체 | Oracle 커널 내부 코드 |
| 동작 시점 | 내부 데이터 구조를 읽거나 쓸 때 |
| 지속 시간 | 매우 짧음 (수 밀리초 이하) – 작업 완료 후 즉시 해제 |
| 예시 | cache buffers chains latch, shared pool latch, redo allocation latch 등 |
| 조회 뷰 | V$LATCH, V$LATCH_CHILDREN, V$LATCH_MISSES, V$LATCHHOLDER 등 |
동작 예시
- 버퍼 캐시 내 동일 블록 해시 체인에 여러 프로세스가 접근할 때 latch 획득 경쟁 발생
- SQL 파싱 시 Shared Pool 내 Dictionary Cache 접근 보호를 위해 latch 사용
Spinning과 CPU 사용량의 관계
- latch hold time이 짧으면 → spinning이 효율적
- latch hold time이 길면 → spinning이 CPU 낭비
예를 들어
- 1ms 만에 latch가 풀리면, sleep 했다가 깨어나는 것보다 spinning이 훨씬 빠름
- 하지만 latch가 50ms 이상 점유된다면, spinning은 CPU를 낭비하는 결과가 됨
따라서 latch 경합(latch contention)이 심하면 CPU 사용률이 급격히 상승할 수 있습니다.
- Lock은 내부적으로 Enqueue 메커니즘으로 구현됩니다.
→ 즉, “Lock”이라는 용어는 논리적 개념이고, “Enqueue”는 실제 구현 단위입니다.
예: TX, TM, UL 등이 Enqueue Type - Latch는 Enqueue와 달리 스핀락(Spinlock) 형태의 비선점형 락(Non-preemptive lock)입니다.
→ 대기 시 OS-level sleep 대신 짧은 시간 동안 CPU에서 active spin
'📁 Database > Oracle' 카테고리의 다른 글
| [Oracle] Consistent Read(CR) / Current Read(CU) (0) | 2025.11.13 |
|---|---|
| [Oracle] 쿼리 수행 후 실행 통계 확인 (SET AUTOTRACE ON STATISTICS) (0) | 2025.11.13 |
| [Oracle] 아카이브 로그의 최소 보관 주기 (0) | 2025.11.12 |
| [Oracle] 복구 시 open / recover database / recover database using backup controlfile until cancel 차이 (0) | 2025.11.11 |
| [Oracle] RAC 엔진을 이용해 Single로 전환 후 복구(RAC to Single) (0) | 2025.11.10 |