스물두줄

정보관리기술사 · 데이터베이스

팬텀 충돌

팬텀 충돌은 조건에 맞는 새 레코드의 삽입이나 삭제로 생기는 동시성 충돌이다. 기존 행을 바꾸지 않고 행 집합이 바뀌므로, 충돌의 본질은 행이 아니라 범위에 있다. 같은 조건으로 두 번 조회했을 때 결과 집합이 달라지면 팬텀 리드다. 먼저 T1이 조건 P로 범위 질의…

주요 장면

  1. 0:02 정의
  2. 0:22 발생 원리
  3. 0:58 행 잠금의 한계
  4. 1:24 격리 수준
  5. 1:48 방지 기법
  6. 2:25 정리

대본

정의

팬텀 충돌은 조건에 맞는 새 레코드의 삽입이나 삭제로 생기는 동시성 충돌이다.

기존 행을 바꾸지 않고 행 집합이 바뀌므로, 충돌의 본질은 행이 아니라 범위에 있다.

같은 조건으로 두 번 조회했을 때 결과 집합이 달라지면 팬텀 리드다.

발생 원리

먼저 T1이 조건 P로 범위 질의를 실행해 결과 집합을 얻는다.

그다음 T2가 조건 P를 만족하는 새 행을 삽입하고 커밋한다.

T1이 같은 질의를 다시 실행하면 행 집합이 달라져 있다.

직렬 실행으로는 나올 수 없으므로 직렬 가능성이 깨진다.

재질의 결과가 달라진 이 현상이 바로 팬텀 리드다.

행 잠금의 한계

행 단위 잠금은 이미 존재하는 행에만 걸린다. 새로 삽입되는 행은 잠금 대상이 아니다.

조건에 맞는 행이 0건이면 잠글 행 자체가 없어 행 잠금을 걸 수 없다.

그래서 조건 범위 전체를 잠가야 한다. 이것이 술어 잠금의 발상이다.

기호로 쓰면 T1이 P를 두 번 읽는 사이 T2가 P 속 행 x를 쓰는 것이다.

격리 수준

격리 수준은 허용하는 이상 현상의 종류로 구분된다. 팬텀 리드는 핵심 비교 기준이다.

READ UNCOMMITTED는 세 현상을 모두 허용하고, READ COMMITTED는 Dirty Read만 막는다.

REPEATABLE READ와 SERIALIZABLE의 팬텀 칸은 '—'로 표시된다. 실제 방지 여부는 DBMS 구현으로 확인해야 한다.

방지 기법

팬텀을 막는 방법은 표준 용어가 아니라 DBMS가 구현한 기법이다.

프레디킷 락은 검색 조건을 그대로 잠가 가장 정확하지만 구현 비용이 크다.

넥스트 키 락은 인덱스 구조로 근사한 방식이라 잠금 범위가 넓어질 수 있다.

직렬 가능 격리는 SSI처럼 충돌을 추적해 위험한 트랜잭션을 중단하고 재시도하게 한다.

충돌 구체화는 잠금용 행을 미리 만드는 방식이라 최후의 수단으로 쓴다.

정리

지금까지 본 팬텀 충돌을 세 가지로 정리한다.

팬텀은 삽입이나 삭제로 범위 질의 결과가 바뀌는 집합 단위의 충돌이다.

방지에는 프레디킷 락, 넥스트 키 락, 직렬 가능 격리, 충돌 구체화가 있다.

시험에서는 팬텀과 쓰기 스큐를 구별해 쓰는 것이 중요하다.

같은 장의 영상