Database

🗂️ 데이터베이스 트랜잭션 격리 수준 (Isolation Level) 총정리

정의

  • 여러 트랜잭션 동시 실행될 때
  • 한 트랜잭션이 다른 트랜잭션의 작업에 영향 받지 않게 할 수 있는 정도를 결정하는 설정값

💡 정합성과 성능의 트레이드오프 (반비례 관계)

  • 낮은 격리 수준: 동시 처리 성능 ⬆️, 데이터 일관성 문제 발생 위험 ⬆️
  • 높은 격리 수준: 데이터 일관성 보장 ⬆️, 동시 처리 성능 ⬇️

1. 발생하는 데이터 동시성 문제 3가지

격리 수준이 낮을 때 발생할 수 있는 데이터 불일치 현상들입니다. 이 문제들을 이해하면 각 격리 수준의 특징을 쉽게 파악할 수 있습니다.

  • Dirty Read (오염된 읽기)
    • 다른 트랜잭션이 작업 중인 ‘아직 커밋되지 않은’ 데이터를 읽는 현상입니다.
    • 해당 데이터가 롤백될 경우, 없는 데이터를 바탕으로 작업하게 되어 큰 일관성 문제가 발생합니다.
  • Non-Repeatable Read (반복 불가능한 읽기)
    • 한 트랜잭션 안에서 같은 데이터를 두 번 읽었을 때, 첫 번째와 두 번째의 결과가 다른 현상입니다.
    • 중간에 다른 트랜잭션이 해당 데이터를 수정(Update)하거나 삭제(Delete)했기 때문에 발생합니다.
  • Phantom Read (유령 읽기)
    • 한 트랜잭션에서 동일한 조건으로 쿼리를 두 번 실행했을 때, 이전에 없던 새로운 데이터(유령)가 나타나거나 사라지는 현상입니다.
    • 중간에 다른 트랜잭션이 새로운 데이터를 삽입(Insert)하거나 삭제(Delete)했기 때문에 발생합니다.

2. 트랜잭션 격리 수준 4단계

아래로 내려갈수록 격리 수준이 높아지며(데이터 안전성 증가), 성능은 낮아집니다.

격리 수준 특징 요약 Dirty Read Non-Repeatable Read Phantom Read
READ UNCOMMITTED 커밋되지 않은 변경 사항도 조회 허용 (가장 낮음) ⚠️ 발생 ⚠️ 발생 ⚠️ 발생
READ COMMITTED 커밋이 완료된 변경 사항만 조회 허용 🛡️ 방지됨 ⚠️ 발생 ⚠️ 발생
REPEATABLE READ 트랜잭션 중 조회한 레코드는 항상 동일한 결과 보장 🛡️ 방지됨 🛡️ 방지됨 ⚠️ 발생
SERIALIZABLE 트랜잭션이 사용하는 테이블의 모든 행에 잠금(Lock) 🛡️ 방지됨 🛡️ 방지됨 🛡️ 방지됨

📌 각 격리 수준 상세 설명

  • READ UNCOMMITTED: 성능은 가장 좋지만, 데이터 신뢰도가 가장 낮아 실무에서는 거의 사용하지 않습니다.
  • READ COMMITTED: 대부분의 데이터베이스(Oracle, PostgreSQL 등)에서 기본으로 사용하는 수준입니다.
  • REPEATABLE READ: MySQL(InnoDB)의 기본 격리 수준입니다. 행 추가(Insert)를 막지는 않기 때문에 Phantom Read가 발생할 수 있습니다.
  • SERIALIZABLE: 가장 높은 데이터 정합성을 가지지만, 단순한 SELECT 쿼리에도 데이터베이스 잠금(Lock)이 걸려 동시 처리 능력이 가장 떨어집니다.

results matching ""

    No results matching ""