핵심 메시지
WHERE user_id = 1
행 잠금은 현재 결과를 지키지만, 팬텀은 같은 조건으로 나중에 들어온다
팬텀 읽기가 어려운 이유는 이미 읽은 행이 아니라 조건에 새로 편입되는 행이 문제이기 때문입니다.
T1 첫 조회
2건
현재 존재하는 행만 잠금
조건을 만족하는 기존 행만 읽고 잠급니다.
아직 없는 행에는 잠금을 걸 수 없습니다.
T2 중간 INSERT
+1건
같은 조건의 새 행이 생성됨
새 행은 첫 조회 시점에 존재하지 않았습니다.
그래서 기존 행 잠금 범위 밖에서 들어옵니다.
T1 다시 조회
3건
같은 WHERE인데 결과 집합이 달라짐
이전에는 없던 행이 결과에 끼어듭니다.
조건은 같고 결과 수만 늘어난 변화가 팬텀입니다.
왜 행 잠금만으로는 부족한가
기존 행 A이미 잠금 가능
비어 있는 구간미래 INSERT 진입 위치
기존 행 B이미 잠금 가능
팬텀은 비어 있던 구간으로 들어온다
따라서 필요한 것
행 잠금만으로는 부족하고, 조건이 성립할 범위나 처음 읽은 스냅샷까지 통제해야 합니다.
즉 팬텀 방지의 핵심은 이미 있는 행 보호가 아니라, 미래에 추가될 수 있는 위치를 어떻게 막거나 숨길지에 있습니다.