[DB] PhantomRead란?

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

Phantom Read(팬텀 리드)란?

 

팬텀 리드는 같은 트랜잭션 내에서 동일한 조건으로 여러 번 데이터를 조회했을 때, 새로운 행이 추가되거나 삭제되어 결과가 달라지는 현상입니다.

 

즉, 트랜잭션이 실행되는 동안 다른 트랜잭션에 의해 새로운 데이터가 삽입되거나 삭제되어, 처음 조회한 결과와 이후 조회한 결과가 달라지는 문제입니다.

📌 Phantom Read 예제

 

1️⃣ 문제 상황

1. A 트랜잭션이 WHERE 조건을 만족하는 데이터를 조회합니다.

2. B 트랜잭션이 새로운 데이터를 INSERT합니다.

3. A 트랜잭션이 동일한 조건으로 다시 조회하면, 처음 조회할 때 없던 데이터가 추가된 것을 확인할 수 있습니다.

4. 동일한 SELECT 쿼리를 실행했는데도 새로운 데이터가 추가되면서 결과가 변경됨 → Phantom Read 발생

📌 Phantom Read 예제 (MySQL)

-- ✅ 트랜잭션 A: 특정 조건을 만족하는 데이터를 조회
START TRANSACTION;
SELECT * FROM orders WHERE price > 1000;
-- 결과: 2개의 행이 조회됨

-- ✅ 트랜잭션 B: 새로운 데이터를 삽입 (commit)
START TRANSACTION;
INSERT INTO orders (id, price) VALUES (3, 1500);
COMMIT;

-- ✅ 다시 동일한 쿼리를 실행
SELECT * FROM orders WHERE price > 1000;
-- 결과: 3개의 행이 조회됨 → 처음 조회할 때 없던 데이터가 생김 (Phantom Read 발생)
COMMIT;

🔍 원래는 2개의 행만 조회되었지만, 트랜잭션 중간에 INSERT가 발생하면서 3개의 행이 조회되는 문제가 발생!

📌 REPEATABLE READ에서 Phantom Read가 발생하는 이유

• REPEATABLE READ는 트랜잭션 시작 후 조회한 행(row)의 변경을 막지만, 새로운 행(insert) 추가는 막지 않음.

• 즉, 조회한 데이터 자체는 변경되지 않지만, 새로운 데이터가 추가될 수 있어 Phantom Read가 발생.

📌 Phantom Read를 방지하려면?

 

Phantom Read를 방지하려면 SERIALIZABLE 격리 수준을 사용해야 합니다.

이 수준에서는 모든 트랜잭션이 순차적으로 실행되도록 강제하기 때문에, 새로운 데이터 추가나 삭제도 막을 수 있습니다.

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

🔍 단점: 동시성 처리 성능이 크게 저하됨.

📌 Phantom Read와 Non-Repeatable Read 차이

 

문제 유형발생 원인예제
Non-Repeatable Read 같은 데이터를 읽었을 때 값이 변경됨 SELECT 후 UPDATE 발생
Phantom Read 같은 조건으로 읽었을 때 새로운 행이 추가됨 SELECT 후 INSERT 발생

📌 REPEATABLE READ는 Non-Repeatable Read를 방지하지만 Phantom Read는 방지하지 못함.

✅ 결론

• Phantom Read는 같은 조건으로 조회했을 때, 새로운 데이터가 추가되거나 삭제되어 조회 결과가 달라지는 문제.

• REPEATABLE READ는 조회한 데이터의 변경을 방지하지만, 새로운 행이 추가되는 것은 막지 못함.

• SERIALIZABLE 수준을 사용하면 Phantom Read까지 방지 가능하지만, 성능 저하가 큼.

 

즉, “같은 SELECT를 여러 번 실행했는데 처음에는 없던 데이터가 새로 생기는 것” → 이게 Phantom Read!

728x90
반응형
SMALL

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

[DB- MySQL] InnoDB의 구조와 특징  (0) 2025.05.26
SubQuery와 Join 절 성능 분석  (1) 2025.05.22
[DB / Transaction] 트랜잭션 고립 수준  (0) 2025.03.02
[DB / JPA] 낙관적 락과 비관적 락  (0) 2025.03.02
[CS 면접 질문 - DB] 파티셔닝  (0) 2025.01.06
'면접 준비/DB' 카테고리의 다른 글
  • [DB- MySQL] InnoDB의 구조와 특징
  • SubQuery와 Join 절 성능 분석
  • [DB / Transaction] 트랜잭션 고립 수준
  • [DB / JPA] 낙관적 락과 비관적 락
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • 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)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [DB] PhantomRead란?
    상단으로

    티스토리툴바