트랜잭션 격리 수준

Transaction Isolation Levels

트랜잭션 격리 수준은 동시에 수행되는 트랜잭션들이 서로의 중간 결과를 볼 수 있는 정도를 정의한 것으로, ANSI/ISO SQL 표준은 허용되는 이상현상(Dirty Read·Non-Repeatable Read·Phantom Read)에 따라 Read Uncommitted부터 Serializable까지 4단계를 규정한다.

핵심 키워드

ACID 중 격리성(Isolation)Read UncommittedRead CommittedRepeatable ReadSerializableDirty ReadNon-Repeatable ReadPhantom ReadMVCC(다중 버전 동시성 제어)스냅샷 격리·Write Skew

구성도

정리

1. 개요

  • 정의: 동시 트랜잭션 간 간섭(데이터 가시성)을 제어하는 수준, ACID의 Isolation 구현 정도
  • 필요성
    • 완전한 직렬성은 동시성(처리량) 저하 → 정합성과 성능 간 트레이드오프 선택 필요
    • 업무 특성에 맞는 격리 수준 선택으로 이상현상 방지와 성능 확보

2. 구성/원리

① 동시성 이상현상

이상현상내용
Dirty Read커밋되지 않은 다른 트랜잭션의 변경 데이터를 읽음 (이후 롤백 시 불일치)
Non-Repeatable Read같은 행을 두 번 읽는 사이 다른 트랜잭션의 수정·삭제 커밋으로 값이 달라짐
Phantom Read같은 조건 검색을 반복할 때 다른 트랜잭션의 삽입으로 없던 행이 나타남

② ANSI SQL 4단계 격리 수준 (O: 발생 가능, X: 방지)

격리 수준Dirty ReadNon-Repeatable ReadPhantom Read
Read UncommittedOOO
Read CommittedXOO
Repeatable ReadXXO
SerializableXXX

③ 구현 방식

  • 잠금 기반(Locking): 공유·배타 락 보유 기간과 범위(행·범위·프레디킷 락)로 수준 조절, 2PL로 직렬성 보장
  • MVCC: 데이터 변경 시 이전 버전 유지, 읽기는 스냅샷을 참조 → 읽기와 쓰기가 서로 차단하지 않음
    • Read Committed: 문장(Statement) 시작 시점 스냅샷
    • Repeatable Read/스냅샷 격리: 트랜잭션 시작 시점 스냅샷

3. 특징 및 비교

항목낮은 격리 수준높은 격리 수준
동시성·처리량높음낮음
정합성이상현상 허용강함
잠금 경합·교착상태적음많음
적용 예통계성 조회, 대략적 집계금융 이체, 재고 차감
  • 주요 DBMS 기본값: Oracle·PostgreSQL·SQL Server는 Read Committed, MySQL InnoDB는 Repeatable Read
  • InnoDB는 Next-Key Lock으로 잠금 읽기의 팬텀을 방지, PostgreSQL의 Repeatable Read는 스냅샷 격리로 동작

4. 고려사항·최신 동향

  • 고려사항
    • ANSI 정의는 이상현상 기준이라 불완전 → Lost Update, Write Skew 등 미포함 (Berenson 등 1995년 "A Critique of ANSI SQL Isolation Levels" 지적)
    • 스냅샷 격리는 Write Skew 발생 가능 → SELECT ... FOR UPDATE, 제약조건 또는 Serializable 적용
    • 동일 수준 명칭이라도 DBMS별 구현 차이 → 제품별 동작 확인 필수
  • 최신 동향
    • SSI(Serializable Snapshot Isolation): MVCC 기반 직렬성 보장(PostgreSQL Serializable 등)
    • 분산 SQL(NewSQL)에서 분산 스냅샷·타임스탬프 기반 직렬성 제공
    • 마이크로서비스 환경에서는 DB 격리 대신 Saga·보상 트랜잭션으로 정합성 관리

함께 볼 토픽

v1 · 2026. 10. 19. 갱신 · 틀린 내용을 발견하면 알려 주세요.