팬텀리드 해결 예시 질문
Select for update where id = 5 는 id 5만 보이는데 팬텀리드의 예시랑 관련이 있나요?
그리고 이상황에 갭 락이 걸리나요?
레코드락만 걸리지 않나요?
回答 1
1
안녕하세요, Cola님!
정확히 짚어주셨습니다. 좋은 지적 감사합니다.
말씀하신 대로 SELECT ... FOR UPDATE WHERE id = 5에서 id가 PK이고 해당 row가 존재한다면, InnoDB는 갭락 없이 레코드 락만 걸립니다. MySQL 공식 매뉴얼(17.7.3 Locks Set by Different SQL Statements in InnoDB)에도 명시되어 있는 동작이에요.
"For a unique index with a unique search condition, InnoDB locks only the index record found, not the gap before it."
실제로 performance_schema.data_locks 테이블에서 확인하시면 X, REC_NOT_GAP(record lock only)으로 찍히는 케이스에 해당합니다.
전체 락 동작을 정리하면 다음과 같습니다.
InnoDB 락 동작 정리 (REPEATABLE READ 기준)
Unique Index + 정확한 값 + row 존재 => Record lock만 (갭락 X)
Unique Index + 정확한 값 + row 없음 => Gap lock
Non-Unique Index => Next-key lock (Record + Gap)
범위 조건 (BETWEEN, >, < 등) => Next-key lock (Record + Gap)
InnoDB가 팬텀 리드를 막기 위해 기본적으로 next-key lock을 사용하는 큰 그림은 그대로 맞지만, 질문하신 케이스(Unique Index 단일 매치)는 유일성 보장 자체가 팬텀을 원천 차단하기 때문에 InnoDB가 최적화로 레코드 락만 거는 예외 케이스에 해당해요.
자료의 예시(WHERE id = 5)는 next-key lock이 실제로 걸리는 케이스(범위 조건 또는 Non-Unique Index)로 교체하고, 위의 락 동작 정리 표를 보강 자료로 추가해두겠습니다. 디테일까지 정확하게 짚어주신 덕분에 자료가 한 단계 더 정밀해질 것 같아요. 정말 감사합니다!
참고 링크
MySQL 공식 매뉴얼 17.7.3 — 표의 모든 케이스가 명시되어 있습니다
당근 테크 블로그 — MySQL Gap Lock 다시보기 — Real MySQL 8.0 공저자(백은빈)가 작성한 한국어 설명, 그림과 예시가 풍부합니다
아무도 모르게 책 내시면 모르실 줄 알고!!
1
26
2
리뷰
0
20
1
수동으로 계산하기 부분에서 질문
0
22
1
upload_file_id가 1,3,4 순서인 건에 대해
0
27
1
샘플데이터 요청
1
29
2
ALU 강의에서 질문
0
28
2
p.created_at vs u.name 인덱스 문의
0
36
2
이진 트리 노드
0
37
1
조인의 특징
0
37
2
비관적 락과 낙관적 락에서 임계 영역 질문 있습니다.
0
36
2
통계정보 갱신 질문
0
60
2
PK 관련하여 궁금한 점이 있어서 질문 드립니다.
0
63
2
탐색을 한번 더 하지 않게 하는 방식 중 어댑티브 해시 방식도 맞는지 궁금 합니다.
0
67
2
컬럼 크기가 대용량인 경우 DB 버퍼 풀에 전부 올라오는지 궁금합니다
0
56
2
실습데이터 ORDERS 생성 시간 질문요...
0
88
3
MySQL 서버구조 쿼리파서 질문 있습니다 !
0
63
1
상태 기반 데이터관리에서 특정 시점에 대한 정보는 어떻게 관리할 수 있나요?
0
36
1
Postgresql 아키텍처 업데이트
1
82
2
76강 2분33초 내용 오류
0
54
2
인덱스 강의 혹은 해당 강의 전 듣어야 하는 사전강의 문의
0
54
2
ordered_at, paid_at 과 같이
0
40
1
기본편 오타 제보 드립니다.
0
55
2
Substack 신청 문의
0
64
2
MySql
1
84
2

