데이터베이스에서 Lock은 동시성 제어의 핵심 메커니즘으로, 여러 트랜잭션이 동시에 데이터를 접근하거나 변경할 때 데이터 무결성을 보장하기 위해 사용됩니다.
1. Lock의 개념
Lock은 트랜잭션이 특정 데이터나 자원에 대해 접근할 때 다른 트랜잭션이 해당 데이터나 자원에 접근하지 못하도록 제한하는 메커니즘입니다. 이는 데이터의 무결성을 보장하고 교착 상태(Deadlock)나 경합 상태(Race Condition)를 방지하는 데 사용됩니다.
Lock이 필요한 이유
- 데이터 무결성 보장
- 트랜잭션 간 충돌 방지
- 동시성 문제 해결
2. Lock의 종류
Lock은 여러 기준에 따라 분류됩니다. 주요 분류는 다음과 같습니다:
2.1. 잠금 수준에 따른 분류
- Row-Level Lock
- 특정 행(Row)에만 잠금을 설정합니다.
- 동시성을 극대화할 수 있지만, 관리 오버헤드가 증가합니다.
- Table-Level Lock
- 테이블 전체에 잠금을 설정합니다.
- 간단하지만 동시성을 저하시킬 수 있습니다.
- Page-Level Lock
- 데이터 페이지 단위로 잠금을 설정합니다.
- 행 수준과 테이블 수준의 중간 수준 동시성을 제공합니다.
2.2. Lock 모드에 따른 분류
- 공유 락 - Shared Lock (S Lock)
- 데이터를 읽기 전용으로 잠금합니다.
- 다른 트랜잭션은 데이터를 읽을 수 있지만, 쓰기는 불가능합니다.
- 베타 락 - Exclusive Lock (X Lock)
- 데이터를 읽거나 쓰는 작업에 대해 완전히 잠금합니다.
- 다른 트랜잭션은 데이터를 읽거나 쓸 수 없습니다.
2.3. 동작 방식에 따른 분류
- Pessimistic Lock
- 트랜잭션이 시작되면 다른 트랜잭션의 접근을 적극적으로 차단합니다.
- Deadlock 가능성이 있으므로 관리가 필요합니다.
- Optimistic Lock
- 충돌 가능성을 낮게 보고, 트랜잭션 종료 시점에 충돌 여부를 검증합니다.
- 충돌이 빈번하지 않은 환경에 적합합니다.
3. Lock의 특징
- 동시성 제어
- 여러 트랜잭션이 데이터를 동시에 접근하더라도 무결성을 유지합니다.
- 교착 상태 (Deadlock) 관리
- 교착 상태를 방지하거나 해결하기 위한 메커니즘이 필요합니다.
- 성능 고려
- 잠금 설정은 성능 저하를 유발할 수 있으므로 신중히 사용해야 합니다.
- 잠금 타임아웃
- Lock은 일정 시간 동안만 유지되며, 시간이 초과되면 트랜잭션은 롤백됩니다.
4. 블로킹(Blockings)과 Lock
**블로킹(Blockings)**은 트랜잭션이 다른 트랜잭션의 Lock으로 인해 대기 상태에 놓이는 현상을 말합니다. 이는 데이터베이스에서 Lock을 사용할 때 종종 발생하며, 동시성 제어와 성능에 중요한 영향을 미칩니다.
블로킹의 주요 원인
- 긴 트랜잭션
- Lock을 장시간 유지하면 다른 트랜잭션이 대기 상태로 전환됩니다.
- 과도한 Lock 경합
- 동일한 리소스에 여러 트랜잭션이 접근할 경우 블로킹이 발생할 가능성이 높습니다.
- Lock Escalation
- 낮은 수준(Row-Level) Lock이 테이블 전체(Table-Level) Lock으로 확장될 때 블로킹이 유발됩니다.
블로킹 해결 방법
- 트랜잭션 단축
- 트랜잭션 범위를 최소화하여 Lock 유지 시간을 줄입니다.
- 적절한 Lock 레벨 설정
- 경합이 많은 환경에서는 Row-Level Lock을 활용하여 동시성을 높입니다.
- 쿼리 최적화
- 쿼리 실행 시간을 줄이고 Lock이 걸리는 시간을 단축합니다.
- 타임아웃 설정
- 대기 시간이 초과되면 트랜잭션을 중단시키는 방식으로 블로킹을 방지합니다.
5. Lock의 장단점
5.1. 장점
- 데이터 무결성과 일관성 보장
- 동시성 제어로 안정성 향상
- 충돌 방지로 애플리케이션 신뢰성 증대
5.2. 단점
- 성능 저하 가능성
- 교착 상태 발생 위험
- 구현 복잡성 증가
- 블로킹에 의한 대기 시간 증가
6. 결론
데이터베이스 Lock은 데이터 무결성을 보장하고 동시성을 제어하는 데 필수적인 메커니즘입니다. 하지만 잠금으로 인해 발생하는 성능 저하, 교착 상태, 블로킹과 같은 문제를 고려하여 적절히 활용하는 것이 중요합니다.
'IT 개발 라이프 > DB' 카테고리의 다른 글
데이터베이스 트랜잭션(Transaction) (0) | 2024.12.31 |
---|---|
오라클 순위 함수 (Ranking Functions) (0) | 2024.12.17 |
오라클 계층형 쿼리 (Hierarchical Query) (0) | 2024.12.17 |
오라클 COALESCE 함수란? 💡 (0) | 2024.12.17 |
🔢 ORACLE 숫자 함수 총정리 (0) | 2024.12.16 |