같은 트랜잭션의 재조회
처음에는 같은 조건으로 읽었지만, 다시 읽을 때 무엇이 달라졌는지가 두 문제를 가른다
조회 조건
SELECT * FROM orders WHERE amount >= 100
아래 비교는 같은 트랜잭션이 같은 조건으로 다시 읽을 때, 같은 행의 값이 바뀌는지, 아니면 조건에 맞는 행 집합이 바뀌는지를 보여준다.
반복 불가능 읽기
같은 행을 다시 읽었더니 값이 바뀜
조건 결과의 틀은 그대로인데, 이미 존재하던 레코드 하나의 값이 달라진 경우다.
처음 읽음
id=7amount=120
id=9amount=180
다시 읽음
id=7amount=150
id=9amount=180
주된 원인: UPDATE
같은 기본키를 다시 읽었는데 컬럼 값이 이전과 다르게 보인다.
행 잠금으로 다루기 쉬움
문제가 되는 대상이 이미 존재하는 행이므로, 그 행을 잠그면 값 변경 충돌을 제어할 수 있다.
팬텀 읽기
같은 조건으로 다시 조회했더니 행 수가 달라짐
문제의 대상은 특정 행 하나가 아니라, 그 조건에 포함되는 결과 집합 전체다.
처음 읽음
id=7amount=120
id=9amount=180
다시 읽음
id=7amount=120
id=9amount=180
id=13amount=140
주된 원인: INSERT / DELETE
같은 WHERE 조건인데 새 행이 들어오거나 빠져서 결과 개수가 달라진다.
행 잠금만으로는 부족함
아직 존재하지 않던 행은 잠글 수 없어서, 검색 범위 전체를 지키는 추가 제어가 필요하다.
정리: 반복 불가능 읽기는 기존 행의 값 일관성 문제이고, 팬텀 읽기는 검색 범위의 결과 일관성 문제다.