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 관리
'CS > 데이터베이스' 카테고리의 다른 글
| 레디스 - 캐시 전략 패턴 (0) | 2025.11.04 |
|---|---|
| Schema가 무엇인가요? (0) | 2025.11.03 |
| 트래픽이 높아질 때, DB는 어떻게 관리를 할 수 있을까 (0) | 2025.11.02 |