본문 바로가기

데이터베이스

[데이터베이스] DML Lock의 이중 구조와 Enqueue 대기 메커니즘 심층 분석

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 외에도 필요에 따라 다음과 같은 수동/자동 모드를 지원합니다.