9. Phantom reads
Phantom reads란 같은 조건으로 두 번 조회했는데, 새로운 행 데이터가 추가되거나 사라지는 현상을 말함
ex)
- 트랜잭션 A가 잔액이 100 이상인 고객을 조회 → 10명 확인
- 트랜잭션 B가 잔액 120인 새 고객을 INSERT하고 COMMIT
- A가 다시 같은 조건으로 조회
→ 11명이 됨
트랜잭션 격리 레벨을 READ COMMITTED로 변경 후 테스트 진행
sql
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;Non-Repetable read처럼 하나의 트랜잭션 내에서 동일한 쿼리를 2번 이상 수행했을 때 결과가 서로 다른 것은 동일함
차이점은
트랜잭션(B)에서 INSERT 쿼리를 통해 새로운 레코드를 추가한 후 COMMIT을 수행하면,
트랜잭션 A에서 조회 쿼리를 다시 수행했을 때, 이전에는 없던 레코드의 결과까지 읽게 되는 상황(Phantom read)
| 수행 시점 | 트랜잭션 A | A 결과 | 트랜잭션 B | B 결과 |
|---|---|---|---|---|
| (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