DB Locking
1. DB Locking이란
- DB Locking은 데이터베이스에서 동시성 제어를 위해 사용하는 메커니즘이다.
- 여러 트랜잭션이 동시에 같은 데이터에 접근할 때 데이터 무결성과 일관성을 보장한다.
2. Lock 동작 방식
- 트랜잭션이 데이터에 접근할 때 Lock을 획득한다.
- 트랜잭션이 완료(COMMIT)되거나 롤백(ROLLBACK)될 때 Lock이 해제된다.
- Lock을 오래 보유하면 Deadlock이나 Blocking이 발생할 수 있다.
3. Lock 종류
3.1 권한에 따른 분류
Lock 종류 | 특징 |
---|
Shared Lock (S Lock) | 읽기 가능, 수정 불가. 다른 트랜잭션도 Shared Lock 획득 가능 |
Exclusive Lock (X Lock) | 읽기/쓰기 모두 독점. 다른 트랜잭션은 어떠한 Lock도 획득 불가 |
요약 표:
요청 | 현재 S Lock | 현재 X Lock |
---|
S Lock 요청 | 가능 | 대기 |
X Lock 요청 | 대기 | 대기 |
3.2 범위에 따른 분류
범위 | 특징 |
---|
Row-level Lock | 특정 Row에만 Lock. 동시성 매우 높음 |
Page-level Lock | 디스크 블록 단위로 Lock. 중간 수준의 동시성 |
Table-level Lock | 테이블 전체에 Lock. 동시성 가장 낮음 |
3.3 기타 Lock
Lock 종류 | 특징 |
---|
Intent Lock | 상위 객체에 Lock 예약 표시 |
Update Lock | 수정 가능성 있는 경우 선점 |
Schema Lock | 테이블 구조 변경 시 사용 |
4. Lock 관련 문제
4.1 Deadlock
- 두 개 이상의 트랜잭션이 서로 상대방이 점유한 리소스를 요청하면서 발생하는 교착 상태.
Deadlock 예시:
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;
BEGIN;
UPDATE account SET balance = balance + 100 WHERE id = 2;
Deadlock 해결 방법:
- 트랜잭션 짧게 유지
- Lock 순서 일관성 유지
- 타임아웃 설정
4.2 Blocking
- 하나의 트랜잭션이 Lock을 유지한 동안 다른 트랜잭션이 대기하는 현상.
4.3 Starvation
- 특정 트랜잭션이 Lock을 획득하지 못하고 계속 대기하는 현상.
5. Isolation Level과 동시성 문제
5.1 Dirty Read (더티 리드)
- Dirty Read는 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 내용을 읽는 현상이다.
- 이러한 읽기는 트랜잭션이 롤백될 경우 잘못된 데이터를 읽을 수 있어 데이터 무결성을 해칠 수 있다.
5.2 Non-repeatable Read (반복 불가능한 읽기)
- Non-repeatable Read는 한 트랜잭션이 같은 데이터에 대해 두 번 읽을 때, 다른 트랜잭션이 그 데이터를 수정하여 결과가 달라지는 현상이다.
- 예를 들어, 한 트랜잭션이 데이터를 읽은 후 수정한 다른 트랜잭션이 있을 때 발생한다.
5.3 Phantom Read (팬텀 리드)
- Phantom Read는 트랜잭션이 특정 조건을 만족하는 데이터를 읽은 후, 다른 트랜잭션이 해당 조건을 변경해 새로운 데이터를 추가하거나 삭제하여 트랜잭션이 두 번째로 읽을 때 결과가 달라지는 현상이다.
- 이는 주로
SELECT
쿼리가 결과를 변경하는 트랜잭션과 겹칠 때 발생한다.
5.4 해결 방법
- Dirty Read, Non-repeatable Read, Phantom Read는 트랜잭션의 격리 수준을 조정하여 해결할 수 있다.
- 격리 수준:
- Read Uncommitted: 가장 낮은 격리 수준, Dirty Read 가능.
- Read Committed: Dirty Read를 방지하지만 Non-repeatable Read 발생 가능.
- Repeatable Read: Non-repeatable Read를 방지하지만 Phantom Read 발생 가능.
- Serializable: 가장 높은 격리 수준, 모든 동시성 문제가 방지된다.
6. Locking 전략
전략 | 특징 |
---|
Pessimistic Locking | 데이터 읽기 전에 Lock을 걸어 충돌 예방. 성능 저하 가능성 있음 |
Optimistic Locking | 데이터 변경 시점에 충돌 감지. 동시성은 높지만 충돌 가능성 존재 |
Pessimistic Lock 예시:
SELECT * FROM product WHERE id = 100 FOR UPDATE;
Optimistic Lock 예시:
UPDATE product
SET stock = stock - 1, version = version + 1
WHERE id = 100 AND version = 3;
7. DBMS별 Lock 특성
DBMS | 특징 |
---|
MySQL (InnoDB) | Row-level Lock 기본. Gap Lock 존재 |
Oracle | MVCC로 일관성 제공. Deadlock 감지 가능 |
PostgreSQL | MVCC 기반. 읽기 작업 중 Lock 발생 안 함 |
8. 실무 Lock 튜닝 방법
- 트랜잭션을 짧게 유지
- 명시적 Lock 최소화
- 데이터 접근 순서 일관성 유지
- 인덱스 최적화로 Lock 범위 최소화
- Deadlock 모니터링 및 로그 분석
요약
- DB Locking은 데이터 무결성과 일관성을 보장하기 위한 장치다.
- 상황에 따라 Pessimistic Locking 또는 Optimistic Locking을 선택한다.
- Deadlock, Blocking을 방지하려면 트랜잭션과 쿼리를 신중하게 설계해야 한다.
- Dirty Read, Non-repeatable Read, Phantom Read는 트랜잭션의 격리 수준을 조정하여 방지할 수 있다.