본문 바로가기

CS/데이터베이스

DB Locking에 대하여

DB Locking이란?

Locking은 여러 트랜잭션이 동시에 같은 데이터를 읽거나 쓸 때, 데이터의 일관성을 보장하기 위해 DB가 데이터 접근을 제어하는 메커니즘이다.

 

Lock의 종류

Shared Lock(S-Lock): 읽기만 가능한 Lock. 여러 트랜잭션이 동시에 공유 가능
Exclusive Lock(X-Lock): 쓰기 Lock. 해당 데이터에 대한 다른 접근(읽기/쓰기) 모두 차단
Intention Lock: 상위 테이블 단위에서 하위 레벨 Lock 설정을 하기 위한 신호
Row-level Lock: 특정 행에만 걸림(PostgreSQL, InnoDB)
Table-level Lock: 전체 테이블 단위로 걸림

 

Optimistic Lock vs Pessimistic Lock

Optimistic Lock: 충돌이 거의 없다고 가정하고, 우선 자유롭게 접근 후 최종단계에서 충돌 감지

방식: version 컬럼을 이용한 비교 후 갱신

장점: 동시성 높음, Lock 비용 없음

단점: 충돌 시 롤백 발생

적합한 상황: 충돌이 드문 시스템

예시 코드: JPA의 @Version 컬럼 기반 갱신

 

Pessimistic Lock: 충돌이 자주 발생한다고 가정, 먼저 Lock을 걸고 다른 접근 차단

방식: DB의 SELECT ... FOR UPDATE 등으로 물리적 Lock을 휙든

장점: 충돌 방지 확실, 데이터 정합성 보장

단점: Deadlock, Timeout 발생 가능

적합한 상황: 충돌이 잦은 시스템 (재고, 계좌 이체 등)

예시 코드: @Lock(LockModeType.PESSIMISTIC_WRITE) 또는 직접 SELECT ... FOR UPDATE

 

비정상 종료 시 Lock이 해제되지 않는 문제

물리적 Lock을 휙득한 트랜잭션이 비정상 종료되면, Lock이 영구적으로 남을 수 있지 않을까 생각하지만, DB는 자동 복구 메커니즘을 가진다.

 

DB 내부 해결책

1. 트랜잭션 기반 Lock 관리: 트랜잭션이 commit 또는 rollback되면 자동으로 Lock 해제

2. 세션 단위 Lock 해제: DB는 Lock을 세션/커넥션 단위로 관리

3. Deadlock Detention

- 주기적으로 Lock dependency graph를 검사하여 Deadlock 탐지 및 트랜잭션 강제 롤백

 

우리가 할 수 있는 추가적인 대응책

- Lock Timeout 설정, Heartbeat 관리, Retry 메커니즘, Connection Pool 관리