[Oracle] Lock과 Latch

728x90

Lock과 Latch의 차이점에 대해 고민해보신 적이 있으신가요?

 

Oracle에서 LockLatch는 모두 동시성 제어(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 사용률이 급격히 상승할 수 있습니다.

  1. Lock은 내부적으로 Enqueue 메커니즘으로 구현됩니다.
    → 즉, “Lock”이라는 용어는 논리적 개념이고, “Enqueue”는 실제 구현 단위입니다.
    예: TX, TM, UL 등이 Enqueue Type
  2. Latch는 Enqueue와 달리 스핀락(Spinlock) 형태의 비선점형 락(Non-preemptive lock)입니다.
    → 대기 시 OS-level sleep 대신 짧은 시간 동안 CPU에서 active spin

 

 

 

728x90