DB Locking

agnusdei·2025년 4월 27일
0

Database

목록 보기
4/30

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 예시:

-- 트랜잭션 A
BEGIN;
UPDATE account SET balance = balance - 100 WHERE id = 1;

-- 트랜잭션 B
BEGIN;
UPDATE account SET balance = balance + 100 WHERE id = 2;

-- 이후 A가 id=2를, B가 id=1을 Lock 요청 → Deadlock

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 존재
OracleMVCC로 일관성 제공. Deadlock 감지 가능
PostgreSQLMVCC 기반. 읽기 작업 중 Lock 발생 안 함

8. 실무 Lock 튜닝 방법

  • 트랜잭션을 짧게 유지
  • 명시적 Lock 최소화
  • 데이터 접근 순서 일관성 유지
  • 인덱스 최적화로 Lock 범위 최소화
  • Deadlock 모니터링 및 로그 분석

요약

  • DB Locking은 데이터 무결성과 일관성을 보장하기 위한 장치다.
  • 상황에 따라 Pessimistic Locking 또는 Optimistic Locking을 선택한다.
  • Deadlock, Blocking을 방지하려면 트랜잭션과 쿼리를 신중하게 설계해야 한다.
  • Dirty Read, Non-repeatable Read, Phantom Read는 트랜잭션의 격리 수준을 조정하여 방지할 수 있다.

0개의 댓글