idea·blog

DB 동시성 미니랩

동시에 마지막 좌석을 누르면 누가 예약될까?

남은 자리는 하나. 두 사람이 같은 순간에 예약 버튼을 누릅니다. 잠금이 없으면 좌석 하나가 두 명에게 팔려요. 트랜잭션과 잠금이 어떻게 “한 명만 성공”을 만드는지 한 단계씩 따라가 보세요.

이것만 기억하세요같은 값을 동시에 읽으면
중복 예약이 생긴다 →
잠금으로 순서를 세운다

방식을 고르고 버튼을 누르세요

세 가지 방식이 같은 상황을 다르게 끝냅니다

두 트랜잭션이 같은 자리 1개를 보고 둘 다 예약합니다.

준비

‘예약 경쟁 시작’을 누르면 두 사용자가 동시에 마지막 좌석을 예약하는 과정을 한 단계씩 보여드려요.

대기 중
사용자 A대기

아직 시작 전

본 좌석
본 버전

공연 좌석 (DB 행)

빈 좌석
seats_left
1
version
v5
잠금
없음
예약 기록
없음
사용자 B대기

아직 시작 전

본 좌석
본 버전
아직 아무 일도 일어나지 않았어요.버튼을 누르면 두 트랜잭션이 주고받는 명령이 여기에 순서대로 쌓입니다.

한눈에 비교

세 방식은 마지막 좌석을 이렇게 처리합니다

잠금 없음

두 트랜잭션이 같은 자리 1개를 보고 둘 다 예약합니다.

좌석 하나가 두 명에게 팔렸습니다 — 중복 예약(오버부킹).

비관적 잠금

SELECT … FOR UPDATE로 먼저 잠그고 한 명씩 순서대로 처리합니다.

A만 성공, B는 잠금이 풀린 뒤 '자리 없음'을 보고 거절됩니다.

낙관적 잠금

일단 진행하고, 커밋할 때 버전 번호로 충돌을 감지합니다.

A만 성공, B는 버전이 바뀌어 0행 갱신 → 충돌로 거절됩니다.

교육용 시뮬레이션입니다.

이 페이지는 실제 데이터베이스 실행이 아니라, 트랜잭션·잠금 규칙을 따라 만든 교육용 시뮬레이션입니다. 좌석 수(1)와 버전 번호(v5)는 읽기 쉽게 고정한 예시값이며, 두 트랜잭션의 실행 순서도 이해를 돕기 위해 대표적인 한 가지로 고정했습니다. 실제로는 트랜잭션 격리 수준, 인덱스·유니크 제약, 데드락, 재시도 정책에 따라 세부 동작이 달라집니다.

참고 개념: 트랜잭션 원자성 · SELECT … FOR UPDATE(비관적) · 버전 컬럼(낙관적)

실험을 마쳤다면