데이터베이스 시스템에서 동시성과 동시성 제어

Kkd·2024년 12월 18일
0

매일메일 개념정리

목록 보기
35/93

데이터베이스 시스템에서 동시성과 동시성 제어


동시성 (Concurrency)

  • 동시성은 여러 트랜잭션이 동시에 실행되는 것을 의미합니다.
  • 데이터베이스는 여러 사용자의 요청을 처리해야 하므로 동시성은 필수적입니다.
  • 동시성을 효과적으로 처리하면 응답 시간이 줄고 시스템 자원의 효율적인 활용이 가능합니다.

동시성으로 인한 문제점

동시성은 성능을 향상시키지만, 잘못 관리하면 데이터 무결성을 해칠 수 있습니다.

1. Dirty Read (더티 읽기)

  • 한 트랜잭션이 커밋되지 않은 데이터를 읽는 경우.
  • 예: A 트랜잭션이 데이터를 수정했지만 아직 커밋하지 않았는데, B 트랜잭션이 이를 읽습니다.

2. Non-Repeatable Read (비반복 읽기)

  • 동일 트랜잭션에서 같은 데이터를 두 번 읽을 때 값이 달라지는 상황.
  • 예: 첫 번째 읽기 후, 다른 트랜잭션이 데이터를 수정하거나 삭제한 경우.

3. Phantom Read (팬텀 읽기)

  • 한 트랜잭션이 같은 쿼리를 반복 실행할 때 새로운 행이 추가되거나 기존 행이 삭제된 상황.
  • 예: 범위를 검색한 결과가 다른 트랜잭션의 삽입/삭제로 인해 달라지는 경우.

4. Lost Update (갱신 손실)

  • 두 트랜잭션이 동시에 데이터를 수정하여 한 트랜잭션의 변경사항이 유실되는 경우.
  • 예: A와 B가 동일한 값을 업데이트하지만, B가 A의 결과를 덮어씌움.

동시성 제어 방법

동시성 제어는 트랜잭션 간의 상호작용을 조율하여 데이터 무결성을 보장합니다.

1. 락(Lock) 기반 제어

  • 트랜잭션이 데이터에 접근할 때 락(잠금)을 설정하여 다른 트랜잭션의 접근을 제한합니다.

1) 락의 종류

  • 공유 락 (Shared Lock)

    • 데이터를 읽을 때 사용.
    • 여러 트랜잭션이 동시에 공유 락을 획득할 수 있지만, 쓰기(베타 락)는 불가능.
  • 배타 락 (Exclusive Lock)

    • 데이터를 수정할 때 사용.
    • 하나의 트랜잭션만 락을 획득할 수 있으며, 다른 트랜잭션은 읽기/쓰기가 모두 불가능.

    공유 락(Shared Lock)과 배타 락(Exclusive Lock)

2) 문제점과 해결책

  • 문제점: 교착 상태(Deadlock) 발생 가능.
  • 해결책: 타임아웃 설정 또는 락 순서를 명시하여 교착 상태를 방지.

2. 낙관적 동시성 제어 (Optimistic Concurrency Control)

  • 데이터에 락을 사용하지 않고, 트랜잭션 완료 시 데이터의 변경 충돌 여부를 확인.
  • 데이터 충돌 발생 시, 트랜잭션을 롤백 후 재시도.
  • 충돌 가능성이 낮은 환경에서 적합.

예시:

-- 데이터 읽기
SELECT balance FROM accounts WHERE id = 1;

-- 변경 후 확인
UPDATE accounts 
SET balance = balance - 100
WHERE id = 1 AND last_updated = '2023-12-18 10:00:00';
  • last_updated를 확인하여 충돌 여부를 판단.

3. 타임스탬프 순서 제어 (Timestamp Ordering)

  • 트랜잭션이 시작될 때 타임스탬프를 할당하고, 이를 기준으로 트랜잭션 실행 순서를 보장.
  • 읽기/쓰기 충돌 발생 시 충돌 트랜잭션을 롤백.

4. 다중 버전 동시성 제어 (MVCC)

  • 데이터를 수정할 때 기존 데이터를 유지하고 새로운 버전을 생성.
  • 각 트랜잭션은 자신이 시작된 시점의 데이터 버전을 사용.
  • 읽기와 쓰기가 충돌하지 않으므로 읽기 성능이 뛰어남.

사용 사례: PostgreSQL, MySQL (InnoDB)

트랜잭션 격리 수준 (Transaction Isolation Levels)

SQL 표준에서는 트랜잭션 격리 수준을 제공하여 동시성 제어의 강도를 조절합니다.

  1. Read Uncommitted

    • 커밋되지 않은 데이터 읽기 허용.
    • 성능은 높지만 데이터 무결성이 약함.
  2. Read Committed

    • 커밋된 데이터만 읽을 수 있음.
    • Dirty Read 방지.
  3. Repeatable Read

    • 동일 트랜잭션에서 동일 데이터를 읽을 때 항상 같은 결과.
    • Dirty Read, Non-Repeatable Read 방지.
  4. Serializable

    • 가장 엄격한 수준.
    • 트랜잭션이 순차적으로 실행되는 것처럼 동작.
    • Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.

결론

  • 데이터베이스 시스템에서 동시성은 성능과 데이터 무결성 사이의 균형을 요구합니다.
  • 락, 낙관적 동시성 제어, MVCC 등 다양한 동시성 제어 기법을 활용하여 문제를 방지할 수 있습니다.
  • 애플리케이션의 요구 사항과 트랜잭션 특성에 따라 적절한 제어 방법과 격리 수준을 선택해야 합니다.

추가 학습 자료

profile
🌱

0개의 댓글