데이터베이스 기초

트랜잭션 T1이 SELECT COUNT(*) FROM 주문 WHERE 금액 >= 1000을 실행했더니 8건이었다. 그 직후 T2가 금액 2000인 주문 행을 INSERT하고 커밋했다. T1이 같은 SELECT 문을 다시 실행하자 9건이 되었다. 이 현상은?

  1. A반복 불가능한 읽기(non-repeatable read)
  2. B더티 리드
  3. C팬텀 리드
정답과 해설 보기

정답: C. 팬텀 리드

하나의 트랜잭션 안에서 같은 조건의 검색을 반복했을 때, 그 사이에 다른 트랜잭션이 조건에 맞는 행을 추가(또는 삭제)하고 커밋했기 때문에 결과 행의 모음이 바뀌는 현상을 팬텀 리드(팬텀)라고 합니다. 새로 나타난 행이 유령(팬텀) 같다는 것이 이름의 유래입니다. 반복 불가능한 읽기는 이미 읽은 같은 행을 다른 트랜잭션이 UPDATE나 DELETE하고 커밋했기 때문에, 다시 읽으면 값이 바뀌어 있는(또는 행이 없어진) 현상입니다. 기존 행에 건 락으로는 아직 존재하지 않는 행의 추가를 막을 수 없으므로, 팬텀을 막으려면 검색 조건에 해당하는 범위를 락하는 등의 구조가 필요합니다. SQL 표준 규격에서는 격리 수준을 SERIALIZABLE로 하면 팬텀도 일어나지 않습니다. T2는 커밋했으므로 더티 리드가 아닙니다.

이 분야 연습하기 분야로 돌아가기

데이터베이스 기초의 다른 문제

  1. SQL 표준 규격이 정하는 격리 수준 중 READ COMMITTED에서 일어날 수 있는 현상의 조합으로 올바른 것은?
  2. 트랜잭션 T1이 어떤 행에 공유 락을 걸고 읽고 있다. 이 행에 대해 T2가 공유 락을, T3가 배타 락을 요구했다. T1이 락을 해제할 때까지의 동안에 대해 올바른 것은?
  3. 트랜잭션의 동시성 제어에 사용되는 2단계 로킹 방식에 대한 설명으로 올바른 것은?
  4. 트랜잭션 T1은 행 A에 배타 락을 건 뒤 행 B의 락을 요구하고, T2는 행 B에 배타 락을 건 뒤 행 A의 락을 요구했기 때문에 둘 다 앞으로 나아갈 수 없게 되었다. DBMS가 이 상태를 감지했을 때 하는 일반적인 대처는?
  5. 많은 DBMS는 데이터를 갱신할 때 갱신 내용을 로그(저널)에 기록하고, 그 로그를 데이터베이스 본체보다 먼저 비휘발성 저장 장치에 쓴다(WAL: 로그 선행 기록). 이 방식을 취하는 주된 이유는?