Concurrency Controll
운영 환경에서 Lock 관리는 시스템의 가용성과 데이터 무결성을 결정짓는 핵심 중의 핵심입니다. 미들웨어의 Thread Lock이 애플리케이션의 흐름을 제어한다면, 데이터베이스의 Lock은 데이터를 보호하는 최후의 마지노선 이죠.


연봉(salary) 정보를 업데이트하는 두 쿼리가 동시에 경합한다면 어떤 일이 벌어질까요?
1단계: 첫 번째 트랜잭션(T1)의 Lock 점유
행 레벨 Lock 획득: T1이 특정 행을 수정하기 위해 UPDATE 문을 실행하면, 오라클은 즉시 해당 행에 대해 행 레벨(Row-level) Lock을 획득합니다.
자동 모드 선택: 이때 오라클은 다른 트랜잭션과의 충돌을 최소화하기 위해 가장 낮은 레벨인 ROW EXCLUSIVE Lock 모드를 자동으로 선택합니다.
배타적 제어: 이 Lock은 T1에게 해당 데이터에 대한 배타적 제어권을 부여하여, 작업이 끝날 때까지 다른 트랜잭션이 해당 데이터를 수정하지 못하도록 보호합니다.
2단계: 두 번째 트랜잭션(T2)의 접근과 대기
경합 발생: 거의 동시에 T2가 동일한 행을 수정하려고 시도합니다.
큐(Queue) 진입: 이미 T1이 배타적 Lock을 점유하고 있으므로, T2는 즉시 수정하지 못하고 대기 상태에 빠집니다.
자동 관리: 오라클의 큐 메커니즘에 따라 T2는 대기열에 등록되며, 관리자의 개입 없이 자동으로 대기 프로세스가 수행됩니다.
3단계: 조회(Query) 세션의 동작 (선택 사항)
Lock 불필요: 만약 제3의 사용자가 해당 데이터를 단순히 조회(SELECT)한다면, Lock을 기다릴 필요가 없습니다.
Undo 정보 활용: 조회 세션은 수정 중인 데이터 대신 Undo 정보로부터 재생성한 "Lock 이전의 원래 값"을 보게 됩니다.
4단계: T1의 종료 및 Lock 해제
확정 또는 취소: T1이 모든 작업을 마치고 COMMIT 또는 ROLLBACK을 실행합니다.
즉시 해제: 트랜잭션이 완료되는 순간, T1이 보유했던 모든 Lock이 즉시 해제됩니다.
비정상 종료 시: 만약 T1 세션이 실패하더라도 백그라운드 프로세스가 자동으로 롤백을 수행하며 Lock을 해제해 줍니다.
5단계: T2의 작업 수행
제어권 이양: T1의 Lock이 해제되자마자 대기열 1순위였던 T2가 해당 행의 Lock을 획득합니다.
최신 데이터 반영: T2는 T1이 최종으로 Commit한 데이터를 바탕으로 자신의 수정을 진행하여 데이터 정합성을 유지합니다.
오라클 데이터베이스의 Lock 메커니즘은 데이터의 무결성을 보호하면서도 최대한의 동시성(Concurrency)을 보장하도록 설계되어 있습니다. '하위 단계(Fine-grain)의 행 레벨 Lock'은 오라클 데이터베이스가 대량의 사용자를 동시에 처리할 수 있는 핵심 비결입니다. 티베로나 MySQL같은 오픈소스들이 오라클을을 흉내 모방하여 제품을 출시하였지만, 위와같은 오라클의 동시성 알고리즘은 따라갈 수 가 없습니다.
오라클 Lock의 핵심 원칙
👉 배타적 제어
데이터를 수정하려면 반드시 Lock을 획득해야 하며, 해당 트랜잭션이 완료될 때까지 다른 세션은 수정할 수 없습니다.
👉 동시성 극대화
블록이나 테이블 전체가 아닌 행 레벨(Row-level) Lock을 기본으로 사용하여 여러 사용자가 같은 테이블의 다른 데이터를 동시에 수정할 수 있게 합니다.
👉 읽기 일관성
데이터를 조회 할 때는 Lock이 필요하지 않습니다. 다른 사용자가 Lock을 걸었더라도 언두(Undo) 정보를 통해 수정 전 데이터를 보여주므로 조회는 항상 성공합니다.
Lock의 획득과 해제
👉 자동화 및 큐(Queue)
다중 트랜잭션이 같은 리소스를 요청하면 첫 번째 요청자가 권한을 얻고 나머지는 큐에서 대기합니다. 이 과정은 오라클이 자동으로 관리합니다.
👉 해제 시점
COMMIT 또는 ROLLBACK 실행 시 모든 Lock이 즉시 해제됩니다. 트랜잭션 실패 시에도 백그라운드 프로세스가 자동으로 롤백 및 Lock 해제를 수행합니다.
👉 최소 레벨 선택
자동 Lock은 충돌을 최소화하기 위해 항상 가장 낮은 레벨부터 시작합니다.
주요 Lock 모드 정리
오라클은 자동 Lock 외에도 필요에 따라 다음과 같은 수동/자동 모드를 지원합니다.

'데이터베이스' 카테고리의 다른 글
| [데이터베이스] SQL 성능의 나침반, 오라클 옵티마이저(Optimizer)와 통계 정보의 중요성 (0) | 2026.02.03 |
|---|---|
| [데이터베이스] DBA의 필수 역량: 솔루션 없이 AWR 스냅샷으로 DB 병목 지점 추적하기 (0) | 2026.02.03 |
| [데이터베이스] 실시간 메모리 vs 물리적 장부: 다이나믹 뷰(V$)와 딕셔너리 (0) | 2026.01.29 |
| [데이터베이스] NOMOUNT에서 OPEN까지: 오라클 인스턴스 기동 단계별 장애 포인트 체크 (0) | 2026.01.29 |
| [데이터베이스] 오라클 물리 저장소의 핵심: Control File부터 데이터 블록 체인화 (2) (0) | 2026.01.29 |