inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Chuẩn bị phỏng vấn CS do chính người phỏng vấn của Channel Talk hướng dẫn - Phần Cơ sở dữ liệu

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

팬텀리드 해결 예시 질문

Đã giải quyết

81

Cola

42 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

자세한 설명 감사합니다!

76강 2분33초 내용 오류

0

39

2

인덱스 강의 혹은 해당 강의 전 듣어야 하는 사전강의 문의

0

40

2

ordered_at, paid_at 과 같이

0

33

1

기본편 오타 제보 드립니다.

0

43

2

Substack 신청 문의

0

49

2

개념과 격벽에 대한 이해를 팀과 공유하고 합의하는 방법

1

63

2

Substack 1년 제공 문의

0

46

2

접근 가능한 카트 목록을 조회하는 API는 없는걸까요?

1

61

2

[실습] WHERE문이 사용된 SQL문 튜닝하기 - 2

0

54

2

[실습] 인덱스 직접 설정해보기/성능 측정해보기

0

56

2

관계도출부분 질문입니다.

0

40

1

물리적 모델링 - 실습 (역정규화) 질문

0

49

2

「김영한의 실전 데이터베이스 - 성능 최적화」

0

65

2

파이프라이닝

1

60

1

진리표를 회로로 변환할 때 F가 0인 경우 don't care

0

60

2

Monolith 아키텍쳐 질문

0

51

1

용어 사전

0

65

2

개념적 모델링 - 실습

0

38

1

섹션8 강의자료가 안열려요

0

41

2

DB 설계와 JPA 관련 질문입니다

0

40

1

드랍 테이블로 지운 ordes에 대해서 질문

0

45

1

문제 풀이 1번 질문

0

44

1

아주 작은 정오표 전달드립니다.

0

79

2

MySql

1

75

2