[DB / Transaction] 트랜잭션 고립 수준

2025. 3. 2. 18:50·면접 준비/DB
728x90
반응형
SMALL

트랜잭션 격리 수준(Isolation Level)

 

트랜잭션 격리 수준(Isolation Level)은 하나의 트랜잭션이 다른 트랜잭션의 변경 사항을 볼 수 있는 정도를 정의하는 규칙입니다.

즉, 데이터의 일관성을 유지하면서 동시성을 관리하는 방법을 결정하는 중요한 요소입니다.

 

1. 트랜잭션에서 발생할 수 있는 동시성 문제

 

트랜잭션이 동시에 실행될 때, 아래와 같은 문제가 발생할 수 있습니다.

문제 유형설명

Dirty Read (더티 리드) 다른 트랜잭션이 커밋하지 않은 데이터를 읽는 문제
Non-Repeatable Read (반복 불가능한 읽기) 같은 데이터를 읽었을 때 값이 변경되는 문제
Phantom Read (팬텀 리드) 같은 조건으로 조회했을 때 새로운 행이 추가되거나 삭제되는 문제

각 트랜잭션 격리 수준은 이러한 문제들을 방지하는 정도가 다릅니다.

2. 트랜잭션 격리 수준 및 특징

격리 수준 Dirty Read Non-Repeatable Read  Phantom Read 성능
READ UNCOMMITTED O (발생 가능) O (발생 가능) O (발생 가능) 가장 빠름
READ COMMITTED X (방지) O (발생 가능) O (발생 가능) 중간
REPEATABLE READ X (방지) X (방지) O (발생 가능) 느림
SERIALIZABLE X (방지) X (방지) X (방지) 가장 느림

각 격리 수준을 자세히 설명하면 다음과 같습니다.

3. 트랜잭션 격리 수준 상세 설명

 

① READ UNCOMMITTED (읽기 미확정)

• 설명

• 트랜잭션이 커밋되지 않은 데이터(Dirty Data)를 읽을 수 있음.

• 즉, 다른 트랜잭션이 변경한 데이터를 커밋하기 전에 볼 수 있음.

• 가장 낮은 격리 수준으로, 동시성은 높지만 데이터 정합성이 보장되지 않음.

• 문제점

• Dirty Read(더티 리드) 발생 가능

• 예를 들어, A 트랜잭션이 데이터를 변경하고 B 트랜잭션이 이를 읽었지만, A 트랜잭션이 롤백하면 B 트랜잭션이 잘못된 데이터를 보게 됨.

• 예제

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

💡 사용 사례

• 데이터 정합성이 중요하지 않은 로그 기록 또는 통계 조회 시스템에서 사용 가능

• 하지만 대부분의 RDBMS는 기본적으로 이 수준을 허용하지 않음

② READ COMMITTED (읽기 확정)

• 설명

• 커밋된 데이터만 읽을 수 있음.

• 다른 트랜잭션이 커밋되지 않은 데이터를 변경하고 있어도 볼 수 없음.

• Dirty Read 문제는 해결되지만, Non-Repeatable Read 문제는 여전히 발생 가능.

• 문제점

• Non-Repeatable Read(반복 불가능한 읽기) 발생 가능

• 같은 데이터를 조회했을 때, 다른 트랜잭션이 값을 변경하고 커밋하면 결과가 달라질 수 있음.

• 예제

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

💡 사용 사례

• 대부분의 RDBMS에서 기본으로 설정되는 격리 수준 (예: Oracle, PostgreSQL)

• Dirty Read를 방지하면서 성능이 READ UNCOMMITTED보다 좋음

③ REPEATABLE READ (반복 가능한 읽기)

• 설명

• 트랜잭션이 시작된 이후 조회한 데이터가 변경되지 않도록 보장.

• 즉, 같은 데이터를 여러 번 조회해도 항상 동일한 값을 보장.

• Dirty Read와 Non-Repeatable Read 문제 해결, 하지만 Phantom Read 문제는 여전히 발생 가능.

• 문제점

• Phantom Read(팬텀 리드) 발생 가능

• 트랜잭션 중 다른 트랜잭션이 새로운 행을 삽입하면, 같은 조건으로 조회했을 때 데이터가 추가된 것처럼 보일 수 있음.

• 예제

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

💡 사용 사례

• 데이터 정합성이 중요한 경우(예: 은행 계좌 조회)

• MySQL의 기본 격리 수준

④ SERIALIZABLE (직렬화)

• 설명

• 가장 높은 격리 수준으로, 트랜잭션이 순차적으로 실행되도록 보장.

• 모든 트랜잭션을 직렬화하여 실행하는 효과.

• Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지.

• 트랜잭션 간 충돌을 방지하지만, 성능 저하가 심함.

• 문제점

• 성능 저하가 가장 심각

• 동시성 처리가 어려워 대기 시간이 증가.

• 일반적으로 락을 사용하여 구현되므로, 많은 트랜잭션이 동시에 실행될 경우 Deadlock 위험 증가.

• 예제

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

💡 사용 사례

• 가장 높은 수준의 데이터 정합성이 필요한 경우 (예: 금융 거래, 회계 시스템)

• 하지만 성능이 크게 저하될 수 있어 최후의 수단으로 사용

4. 트랜잭션 격리 수준 선택 기준

상황추천 격리 수준

최대한 빠른 읽기 속도가 필요하고 데이터 정합성이 덜 중요한 경우 READ UNCOMMITTED
일반적인 웹 애플리케이션, Dirty Read 방지가 필요한 경우 READ COMMITTED
데이터 정합성이 중요하고 같은 데이터를 여러 번 읽을 경우 REPEATABLE READ
가장 높은 데이터 정합성이 필요하고, 동시성이 낮은 경우 SERIALIZABLE

5. MySQL vs PostgreSQL 기본 트랜잭션 격리 수준

DBMS기본 격리 수준

MySQL (InnoDB) REPEATABLE READ
PostgreSQL READ COMMITTED
Oracle READ COMMITTED
SQL Server READ COMMITTED

6. 정리

1. READ UNCOMMITTED: Dirty Read 허용 (정합성 낮음, 성능 좋음)

2. READ COMMITTED: Dirty Read 방지, Non-Repeatable Read 가능 (일반적인 웹 애플리케이션에 적합)

3. REPEATABLE READ: Dirty Read, Non-Repeatable Read 방지, Phantom Read 가능 (MySQL 기본값)

4. SERIALIZABLE: 모든 문제 방지, 가장 강력한 격리 수준 (성능 저하 큼)

 

💡 보통의 웹 애플리케이션에서는 READ COMMITTED 가 가장 적절하고,

💡 데이터 정합성이 중요한 경우 REPEATABLE READ 이상을 고려하는 것이 좋습니다.

728x90
반응형
SMALL

'면접 준비 > DB' 카테고리의 다른 글

SubQuery와 Join 절 성능 분석  (1) 2025.05.22
[DB] PhantomRead란?  (0) 2025.03.02
[DB / JPA] 낙관적 락과 비관적 락  (0) 2025.03.02
[CS 면접 질문 - DB] 파티셔닝  (0) 2025.01.06
[CS 개념 정리 - DB] 정규화  (1) 2025.01.06
'면접 준비/DB' 카테고리의 다른 글
  • SubQuery와 Join 절 성능 분석
  • [DB] PhantomRead란?
  • [DB / JPA] 낙관적 락과 비관적 락
  • [CS 면접 질문 - DB] 파티셔닝
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (329)
      • 면접 준비 (45)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (5)
      • Kafka (5)
      • Spring (60)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (39)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      JSP
      jsp기초
      redis 채팅
      CSS
      자바스크립트
      자바 반복문
      리눅스마스터2급
      JavaScript
      백준
      Til
      자바 면접
      java
      자바
      스프링프레임워크
      리눅스
      프로그래머스
      자바 알고리즘
      리눅스마스터2급정리
      Spring
      springsecurity
      레디스
      Springframework
      redis
      JS
      jsp request
      자바기초
      spring redis
      자바 면접질문
      HTML
      Spring Data Redis
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [DB / Transaction] 트랜잭션 고립 수준
    상단으로

    티스토리툴바