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!
'면접 준비 > 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 |