강한 일관성이 필요한 상태

여러 요청이 하나의 현실 상태를 함께 바꾼다면, 부분 성공이 아니라 한 번의 확정만 허용해야 한다

돈, 재고, 좌석처럼 실제 세계의 수량이나 소유권을 직접 바꾸는 작업은 잠깐의 중간 상태도 문제를 만든다. 이때는 처리 속도보다 잘못된 상태를 아예 보이지 않게 하는 것이 우선이다.

1. 공유 자원 여러 사용자가 같은 금액·수량·좌석을 동시에 건드린다
2. 중간 상태 금지 한쪽만 반영된 결과가 잠깐이라도 보이면 안 된다
3. 필요한 선택 ACID로 묶어 한 번에 커밋하거나 전부 롤백한다
01 금융 이체 A 출금과 B 입금은 같은 거래다

두 계좌의 합계가 항상 보존되어야 한다.

출금과 입금이 한 단위로 확정

둘 중 하나만 저장되면 실제 돈의 흐름과 DB 상태가 어긋난다.

A만 줄고 B는 아직 안 늘어난 상태

잔액 조회 순간마다 다른 진실이 보이면 신뢰를 잃는다.

실패 시 전부 롤백

트랜잭션이 둘을 묶어서 중간 상태 노출을 막는다.

02 재고 차감 마지막 1개 상품은 한 주문에만 배정

동시에 결제 요청이 와도 남은 수량은 음수가 되면 안 된다.

주문 확정과 재고 감소가 동시에 반영

차감보다 주문 확정이 먼저 보이면 초과 판매가 생긴다.

두 주문이 모두 성공해서 재고가 -1

실제 창고보다 더 많이 판 상태가 되어 복구 비용이 커진다.

락 또는 직렬화

한 번에 한 주문만 최종 재고를 확정하게 만든다.

03 좌석 예약 좌석 1개에는 예약 1건만 남아야 한다

같은 좌석을 여러 사용자가 동시에 선택할 수 있다.

예약 생성과 좌석 점유가 함께 완료

점유 표시가 늦으면 같은 좌석을 두 번 팔게 된다.

서로 다른 결제가 같은 좌석에 성공

사후 환불보다 애초에 충돌을 막는 편이 훨씬 싸다.

유니크 제약 + 원자적 확정

한 좌석의 소유권을 단 하나의 커밋만 통과시킨다.

읽는 기준: 나중에 맞춰도 되는 데이터가 아니라면, DB 선택의 핵심은 빠른 응답이 아니라 잘못된 중간 상태를 절대 노출하지 않는 것이다.