트랜잭션 격리수준

이우철·2025년 7월 29일

트랜잭션 격리수준(Transaction Isolation Level)은 동시에 실행되는 여러 트랜잭션들 간의 데이터 접근을 제어하는 메커니즘입니다. SQL 표준에서는 4가지 격리수준을 정의하고 있으며, 각각 다른 수준의 데이터 일관성과 동시성을 제공합니다.
1. READ UNCOMMITTED (레벨 0)
가장 낮은 격리수준으로, 커밋되지 않은 데이터도 읽을 수 있습니다.
특징:

다른 트랜잭션이 수정 중인 데이터를 읽을 수 있음
가장 높은 동시성을 제공하지만 데이터 일관성이 가장 낮음
거의 사용되지 않는 격리수준

발생 가능한 문제:

Dirty Read: 아직 커밋되지 않은 데이터를 읽는 현상
Non-Repeatable Read: 같은 쿼리를 반복 실행했을 때 다른 결과가 나오는 현상
Phantom Read: 범위 검색 시 이전에 없던 레코드가 나타나는 현상

  1. READ COMMITTED (레벨 1)
    대부분의 DBMS에서 기본으로 사용하는 격리수준입니다.
    특징:

커밋된 데이터만 읽을 수 있음
Dirty Read 문제를 해결
읽기 작업 시 공유락(Shared Lock)을 사용하되, 읽은 즉시 해제

발생 가능한 문제:

Non-Repeatable Read: 트랜잭션 도중 다른 트랜잭션이 데이터를 수정하면 같은 쿼리의 결과가 달라질 수 있음
Phantom Read: 범위 검색에서 새로운 레코드가 추가되거나 삭제될 수 있음

해결된 문제:

Dirty Read 방지

  1. REPEATABLE READ (레벨 2)
    한 트랜잭션 내에서 같은 데이터를 여러 번 읽어도 항상 같은 결과를 보장합니다.
    특징:

트랜잭션이 읽은 데이터에 대해 트랜잭션 완료까지 공유락 유지
같은 쿼리를 반복 실행해도 동일한 결과 보장
MySQL InnoDB의 기본 격리수준

발생 가능한 문제:

Phantom Read: 범위 검색 시 새로운 레코드가 나타날 수 있음 (일부 DBMS에서는 해결됨)

해결된 문제:

Dirty Read 방지
Non-Repeatable Read 방지

  1. SERIALIZABLE (레벨 3)
    가장 높은 격리수준으로, 트랜잭션들이 순차적으로 실행되는 것과 같은 결과를 보장합니다.
    특징:

모든 읽기/쓰기 작업에 대해 범위락(Range Lock) 사용
완전한 데이터 일관성 보장
가장 낮은 동시성 (성능 저하 가능성 높음)

해결된 문제:

Dirty Read 방지
Non-Repeatable Read 방지
Phantom Read 방지

격리수준별 문제점 정리

*MySQL InnoDB에서는 REPEATABLE READ에서도 Phantom Read가 방지됩니다.

  • 격리수준 선택 기준
    READ COMMITTED 권장 상황:

일반적인 웹 애플리케이션
높은 동시성이 필요한 경우
약간의 데이터 불일치를 허용할 수 있는 경우

REPEATABLE READ 권장 상황:

금융 시스템 등 데이터 일관성이 중요한 경우
보고서 생성 등 일관된 데이터 조회가 필요한 경우

SERIALIZABLE 권장 상황:

완벽한 데이터 일관성이 필수적인 경우
동시성보다 정확성이 우선인 시스템

격리수준이 높아질수록 데이터 일관성은 향상되지만 동시성은 떨어지므로, 애플리케이션의 요구사항에 따라 적절한 수준을 선택해야 합니다.

profile
개발 정리 공간 - 업무일때도 있고, 공부일때도 있고...

0개의 댓글