데이터베이스 기초
트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?
- A반복 불가능한 읽기(non-repeatable read)
- B더티 리드
- C팬텀 리드
정답과 해설 보기
정답: C. 팬텀 리드
하나의 트랜잭션 안에서 같은 조건의 검색을 반복했을 때, 그 사이에 다른 트랜잭션이 조건에 맞는 행을 추가(또는 삭제)하고 커밋했기 때문에 결과 행의 모음이 바뀌는 현상을 팬텀 리드(팬텀)라고 합니다. 새로 나타난 행이 유령(팬텀) 같다는 것이 이름의 유래입니다. 반복 불가능한 읽기는 이미 읽은 같은 행을 다른 트랜잭션이 UPDATE나 DELETE하고 커밋했기 때문에, 다시 읽으면 값이 바뀌어 있는(또는 행이 없어진) 현상입니다. 기존 행에 건 락으로는 아직 존재하지 않는 행의 추가를 막을 수 없으므로, 팬텀을 막으려면 검색 조건에 해당하는 범위를 락하는 등의 구조가 필요합니다. SQL 표준 규격에서는 격리 수준을 SERIALIZABLE로 하면 팬텀도 일어나지 않습니다. T2는 커밋했으므로 더티 리드가 아닙니다.