📌 면접 답변
1. Phantom Read
-- 트랜잭션 A 시작
START TRANSACTION;
-- 트랜잭션 A 첫 번째 조회
SELECT * FROM orders WHERE amount > 150;
-- 트랜잭션 B 시작
START TRANSACTION;
-- 트랜잭션 B 새로운 행 삽입
INSERT INTO orders (customer_id, amount) VALUES (4, 250);
-- 트랜잭션 B 커밋
COMMIT;
-- 동일한 조건으로 트랜잭션 A 두 번째 조회시, 트랜잭션 A의 첫 번째 조회에는 존재하지 않던, 트랜잭션 B에서 삽입된 새로운 행이 함께 조회된다.
-- 단, MVCC를 지원하는 경우 해당 케이스에서 팬텀 리드가 발생하지 않는다.
SELECT * FROM orders WHERE amount > 150;
- 트랜잭션이 동일한 조건의 쿼리를 반복 실행할 때, 나중에 실행된 쿼리에서 처음에 존재하지 않았던 새로운 행이 나타나는 현상
- 읽기 일관성 유지하는 과정에서 발생하는 문제
- 주로 데이터 삽입, 삭제가 다른 트랜잭션에 의해 이뤄질때 발생
- MVCC를 지원하는 경우 팬텀 리드 발생하지 않음
2. Gap Lock
-- id 1, 3, 5가 저장된 orders 테이블
-- 트랜잭션 A 시작
START TRANSACTION;
-- 트랜잭션 A 1-3과 3-5 사이의 갭과 3 레코드 락 설정(넥스트키 락)
SELECT * FROM orders WHERE orders_id BETWEEN 2 AND 4 FOR UPDATE;
-- 트랜잭션 B 시작
START TRANSACTION;
-- 트랜잭션 B가 id 4에 데이터 삽입 시도 시, 갭락으로 인해 삽입이 차단되어 대기
INSERT INTO orders (orders_id, orders_amount) VALUES (4, 200);
...
- 특정 인덱스 값 사이 공간을 잠그는 락
- 갭 자체를 보호하여, 다른 트랜잭션이 해당 간격에 새로운 행 삽입 차단
- 기존 레코드 수정하는 것은 가능
- 해당 예시에서 Id가 3인 레코드는 수정 가능하지만, 이외 새로 삽입되는 것은 차단
- 삽입 무결성 유지
3. Next Key Lock
-- 트랜잭션 A 시작
START TRANSACTION;
-- 트랜잭션 A amount = 200인 orders_id = 2 레코드에 대한 레코드 락과 1-2, 2-3에 대한 갭락을 동시에 잠금으로써 넥스트키 락을 설정
SELECT * FROM orders WHERE orders_amount = 200 FOR UPDATE;
-- 트랜잭션 B 시작
START TRANSACTION;
-- 트랜잭션 B orders_id = 4, orders_amount = 200인 레코드 삽입 시도 시, 넥스트키 락으로 인해 차단되어 대기
INSERT INTO orders (orders_id, order_amount) VALUES (4, 200);
- 넥스트 키 락 = 레코드 락 + 갭락
- 즉, 레코드와 그 앞뒤 간격까지 모두 락 (갭락과는 다르게 변경도 막음)
- 레코드 뿐만 아니라 그 주변 공간의 변경도 동시에 제어 가능
- 다른 트랜잭션이 새로운 레코드 삽입을 방지하여 팬텀 리드 방지
- 다중 트랜잭션 환경에서 예측 불가능한 데이터 변경 막음
4. Gap Lock과 Next key Lock을 통한 Phantom Read 방지
- 트랜잭션 A가 특정 범위 데이터 조회 시, 해당 범위에 대해 Gap Lcok 또는 Next key Lock 설정
- 락 설정 범위 내에서 트랜잭션 B가 새로운 레코드 삽입 또는 기존 레코드 수정 차단
- 따라서 트랜잭션 A가 동일한 조건으로 조회 수행하더라도, 트랜잭션 B에 의해 새로운 데이터 삽입 되지 않
📌 내 답변
... ???
갭락, 넥스트 키 락, 팬텀 리드가 뭐지 ...
📌 답변 추가 보충
Inno DB 특징
- 스토리지 엔진
- 테이블 생성할 때 어떤 방식으로 데이터 저장하고 읽고 쓰는지 결정하는 엔진
- 트랜잭션 지원
- ACID (원자성, 일관성, 독립성, 지속성) 보장
- BEGIN, COMMIT, ROLLBACK을 통해 트랜잭션 제어
- MVCC
- 여러 트랜잭션이 동시에 읽고 쓸 때 락 대신 MVCC 사용 (성능 높힘)
- 외래키 지원
- 참조 무결성 유지 할 수 있도록 외래키 제약 조건 지원
- 참조 무결성은 외래 키로 참조하는 데이터가 반드시 부모 테이블에 존재해야 함
- 외래키로 테이블 간의 관계 유지 및 부모 테이블과 연결된 데이터 일관성 보장
- 자동 복구 가능
- 버퍼 풀
- 디스크 성능 최적화를 위해 Buffer Pool을 사용하여 자주 사용하는 데이터 메모리에 캐싱
매일메일 - 기술 면접 질문 구독 서비스
기술 면접 질문을 매일매일 메일로 보내드릴게요!
www.maeil-mail.kr
매일 메일의 면접 질문 정리
'😀 Jerry > 면접 질문' 카테고리의 다른 글
[1분 면접] 동기와 비동기의 차이점 (0) | 2025.02.23 |
---|---|
[1분 면접] 공유락과 배타락에 대해 설명 해주세요. (0) | 2025.02.22 |
[1분 면접] DB 시스템에서 동시성 제어하는 방법 (0) | 2025.02.21 |
[1분 면접] HTTP 매서드에서 멱등성이란 무엇인가 ? (0) | 2025.02.21 |
[1분 면접] 사용자가 웹사이트에 처음 접근했을 때 발생하는 일련의 과정 (0) | 2025.02.20 |