Phantom Read란 무엇인가요?
Phantom Read는 트랜잭션이 동일한 조건의 쿼리를 반복 실행할 때, 나중에 실행된 쿼리에서 처음에는 존재하지 않았던 새로운 행이 나타나는 현상입니다. 이는 주로 읽기 일관성(Read Consistency) 을 유지하는 과정에서 발생할 수 있는 문제로, 데이터 삽입이나 삭제가 다른 트랜잭션에 의해 이루어질 때 발생합니다.
-- 트랜잭션 A 시작
START TRANSACTION;
-- 트랜잭션 A 첫 번째 조회
SELECT * FROM orders WHERE amount > 150;
-- 트랜잭션 B 시작
START TRANSACTION;
-- 트랜잭션 B 새로운 행 삽입
INSERT INTO orders (customer_id, amount) VALUES (4, 250);
-- 트랜잭션 B 커밋
COMMIT;
-- 동일한 조건으로 트랜잭션 A 두 번째 조회시, 트랜잭션 A의 첫 번째 조회에는 존재하지 않던, 트랜잭션 B에서 삽입된 새로운 행이 함께 조회된다.
-- 단, MVCC를 지원하는 경우 해당 케이스에서 팬텀 리드가 발생하지 않는다.
SELECT * FROM orders WHERE amount > 150;
팬텀 리드(Phantom Read)는 하나의 트랜잭션 안에서 같은 조건으로 두 번 조회했는데, 사이의 시점에서 다른 트랜잭션이 새로운 행을 삽입 또는 삭제하여, 두 번째 조회 결과에만 그 행이 나타나는 현상을 말합니다.
즉, "같은 SELECT인데 결과가 다르다" 는 점이 핵심입니다.
❓왜 “당연한데 문제냐”는 의문이 생길까?
이는 바로 트랜잭션의 일관성(consistency) 보장 때문입니다.
당신의 말대로, 현실적으로 보면 트랜잭션 B가 커밋한 후에 트랜잭션 A에서 그 값을 본다는 건 당연해 보일 수 있습니다. 그러나, 트랜잭션 A의 입장에서는 ‘일관된 시점’에서의 데이터를 보고 있다고 보장받기를 원할 수 있습니다.
예를 들어, 트랜잭션 A는 아래와 같은 가정을 할 수 있습니다:
“나는 트랜잭션이 시작된 시점의 데이터로 일관된 작업을 수행하고 싶다.”
✅ MVCC와 팬텀 리드
MVCC(Multi-Version Concurrency Control)를 사용하는 DBMS (예: PostgreSQL, MySQL의 InnoDB)는 트랜잭션마다 **스냅샷(Snapshot)**을 따로 관리하여, 트랜잭션이 시작된 시점의 데이터를 기준으로 조회할 수 있게 해줍니다.
📌 예시 상황 (MVCC 사용 시):
트랜잭션 A는 2025-04-09 10:00:00에 시작.
이 시점에 orders 테이블에는 amount > 150인 데이터가 1건 있음.
트랜잭션 B는 10:01:00에 새로운 row 추가 (amount = 250), 커밋.
트랜잭션 A는 10:02:00에 다시 동일한 조건으로 조회.
이때 MVCC를 쓰는 DB에서는 트랜잭션 A의 조회 결과는 처음 조회와 동일해야 합니다. 즉, 새로 삽입된 행은 보이지 않습니다. → 팬텀 리드 방지!
“중간에 추가됐으니까 나오는 거 당연하지 않나?”
→ 현실적으로는 맞습니다.
→ 그러나 트랜잭션의 논리적 일관성을 유지하기 위해선 그것이 문제가 될 수 있습니다.
따라서 이 상황은 “팬텀 리드”라는 이름으로 정의되며, 격리 수준과 동시성 제어에서 매우 중요한 개념입니다.
https://www.maeil-mail.kr/question/93
매일메일 - 기술 면접 질문 구독 서비스
기술 면접 질문을 매일매일 메일로 보내드릴게요!
www.maeil-mail.kr
'매일 공부 > Backend CS' 카테고리의 다른 글
[매일메일] 넥스트키 락(Next-Key Lock)이란? (1) | 2025.04.09 |
---|---|
[매일메일] 갭락(Gap Lock)이란? (0) | 2025.04.09 |
[매일메일] 데이터베이스 시스템 동시성 제어 (MVCC, Lock-Based Concurrency Control) (0) | 2025.04.08 |
[매일메일] HTTP 메서드에서 멱등성이란 (0) | 2025.04.07 |
[매일메일] 스레드, 프로세스, 코어의 수 (0) | 2025.04.03 |