inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Chuẩn bị phỏng vấn CS – Phần Cơ sở dữ liệu, chia sẻ trực tiếp từ người phỏng vấn của Channel Talk

(Câu hỏi phụ) Tại sao InnoDB chỉ với REPEATABLE READ cũng có thể giải quyết Phantom Read? ⭐️

팬텀리드 해결 예시 질문

Đã giải quyết

149

Cola

45 câu hỏi đã được viết

1

Select for update where id = 5 는 id 5만 보이는데 팬텀리드의 예시랑 관련이 있나요?

그리고 이상황에 갭 락이 걸리나요?

레코드락만 걸리지 않나요?

dbms/rdbms nosql computer-science

Câu trả lời 1

1

jayon0927

안녕하세요, 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)로 교체하고, 위의 락 동작 정리 표를 보강 자료로 추가해두겠습니다. 디테일까지 정확하게 짚어주신 덕분에 자료가 한 단계 더 정밀해질 것 같아요. 정말 감사합니다!

 

참고 링크

  1. MySQL 공식 매뉴얼 17.7.3 — 표의 모든 케이스가 명시되어 있습니다

  2. 당근 테크 블로그 — MySQL Gap Lock 다시보기 — Real MySQL 8.0 공저자(백은빈)가 작성한 한국어 설명, 그림과 예시가 풍부합니다

0

Cola

자세한 설명 감사합니다!

용어 관련

1

55

1

Oracle 설치

0

42

2

힌트 적용에 대해서

0

54

1

팔로워수,팔로잉수 조회 설계

1

38

1

강의 "자료" 관련 문의

0

49

1

수료증 제공하나요?

0

48

1

조회 대상 행이 적을 때도 Using filesort 제거를 고려해야 하나요?

0

65

2

강의 관련 질문드립니다.

1

73

2

PK를 AUTO_INCREMENT UUID를 UNIQUE로 하는것에 대해

0

71

2

pk를 auto increment로 하는것에 대해서

0

66

2

getOrCreate / Unique? 멱등 처리 질문

1

76

2

경쟁상태

0

66

1

stmt

0

57

1

실행 통계2 explain analyze 조인 쿼리

0

69

1

3강 인덱스 구조 강의 자료 문의

1

104

1

조회 메서드에서 @Transactional(readOnly=true) 질문

1

57

1

68강 문제 풀이

0

50

1

현대 쿼리 복잡성에 관한 질문

0

122

3

key_length 가 사용되는곳

0

55

1

해당 결제 부분을 포폴에서 테스트 api를 적용에 대한 궁금증

1

68

1

공통 코드 VS Enum 클래스

1

72

1

안녕하세요.

0

71

1

비관적 락과 낙관적 락에서 임계 영역 질문 있습니다.

0

99

2

MySql

1

126

2