5. 트랜잭션 격리수준·락·MVCC, 동시성 이상현상
문제 5 — 트랜잭션 격리수준·락·MVCC, 동시성 이상현상
면접 질문
-
SQL 표준의 4가지 트랜잭션 격리수준(READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE)을 설명하고, 각 수준에서 허용/차단되는 동시성 이상현상(Dirty Read, Non-repeatable Read, Phantom Read)을 표로 정리해보세요.
-
비관적 락(pessimistic lock)과 낙관적 락(optimistic lock)의 차이를 설명하고, 각각 어떤 상황(경합 빈도, 트랜잭션 길이)에 적합한지 말해보세요.
SELECT ... FOR UPDATE는 어느 쪽에 해당하나요? -
MVCC(Multi-Version Concurrency Control)가 무엇이며, "읽기가 쓰기를 막지 않는다"는 특성이 어떻게 가능한지 설명해보세요. MVCC 환경에서도 발생할 수 있는 문제(예: 쓰기 충돌, write skew)는 무엇인가요?
응용 시나리오
게임 내 거래소(auction house)를 만들고 있습니다. 동작은 다음과 같습니다.
- 판매자가 아이템을 등록한다.
- 구매자가 "구매하기"를 누르면 (1) 아이템이 아직 팔리지 않았는지 확인하고, (2) 구매자 골드를 차감하고, (3) 아이템 소유권을 옮기고, (4) 판매자에게 대금을 지급한다.
- 인기 아이템은 동시에 여러 구매자가 같은 매물을 클릭한다.
(a) 격리수준이 너무 낮으면(예: READ COMMITTED) 이 거래에서 어떤 이상현상(예: 같은 매물이 두 명에게 팔리는 double-sell)이 가능한지, 구체적인 인터리빙(interleaving) 시나리오로 설명해보세요.
(b) 이 double-sell을 막기 위해 (1) 격리수준을 올리는 방법, (2) 비관적 락(SELECT ... FOR UPDATE)을 쓰는 방법, (3) 낙관적 락(version/조건부 UPDATE)을 쓰는 방법을 각각 어떻게 적용할지 설계하고, 거래소 특성상 어느 방법이 가장 적합한지 본인의 근거로 선택해보세요.
(c) 인기 매물 한 건에 구매 요청이 폭주할 때(핫 로우, hot row) 락 경합으로 처리량이 급락합니다. 이 핫스팟을 완화하기 위한 방법을 한 가지 이상 제시해보세요.
직접 답을 작성한 뒤, 위 해설 보기에서 모범답안과 대조하세요.