Skip to Content
Suffering builds character

9. Phantom reads

Phantom reads란 같은 조건으로 두 번 조회했는데, 새로운 행 데이터가 추가되거나 사라지는 현상을 말함

ex)

  1. 트랜잭션 A가 잔액이 100 이상인 고객을 조회 → 10명 확인
  2. 트랜잭션 B가 잔액 120인 새 고객을 INSERT하고 COMMIT
  3. A가 다시 같은 조건으로 조회
    → 11명이 됨

트랜잭션 격리 레벨을 READ COMMITTED로 변경 후 테스트 진행

sql
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

Non-Repetable read처럼 하나의 트랜잭션 내에서 동일한 쿼리를 2번 이상 수행했을 때 결과가 서로 다른 것은 동일함

차이점은
트랜잭션(B)에서 INSERT 쿼리를 통해 새로운 레코드를 추가한 후 COMMIT을 수행하면,
트랜잭션 A에서 조회 쿼리를 다시 수행했을 때, 이전에는 없던 레코드의 결과까지 읽게 되는 상황(Phantom read)

수행 시점트랜잭션 AA 결과트랜잭션 BB 결과
(1) BEGIN;(2) BEGIN;
(3) SELECT PRODUCT_ID, QUANTITY * PRICE FROM SALES;
PRODUCT 1(50), PRODUCT 2(80)
트랜잭션 A가 아직 COMMIT되지 않은 상태(4) INSERT INTO SALES VALUES (3, 10, 1);
(5) COMMIT;
(6) SELECT SUM(QUANTITY * PRICE) FROM SALES;140
COMMIT;

해결 방법

격리 수준을 MySQL의 기본 격리 레벨인 REPETABLE READ 상태로 복원

sql
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Last updated on