ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION390 / 1500
데이터베이스난이도 중하5분 답변 목표 · 보강본

직렬화 격리를 켠 뒤 일부 트랜잭션이 실패합니다. 쿼리 하나만 다시 실행하면 되나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

직렬화 실패는 실행 이력 전체를 그대로 확정할 수 없다는 신호일 수 있어 보통 트랜잭션 전체를 새로 시작해야 합니다. 마지막 UPDATE만 반복하면 이미 읽은 낡은 값과 분기를 재사용합니다.

동작 원리와 전제

잔량을 읽고 가격·한도를 계산한 뒤 쓰는 거래에서 충돌이 나면 새 트랜잭션으로 최신 상태를 읽고 계산을 다시 합니다. 오류 코드로 직렬화 실패·데드락·고유 위반·연결 단절을 구분합니다. 연결 단절은 커밋 여부가 불확실할 수 있어 단순 재시도와 다릅니다.

선택과 실패 처리

재시도 횟수와 전체 deadline을 제한하고 지터를 둡니다. 트랜잭션 안에서 이미 호출한 외부 결제는 DB 롤백에 포함되지 않으므로 멱등 키나 outbox로 분리합니다. 반복해서 충돌하면 격리를 낮추기 전에 핫키와 읽기·쓰기 범위를 줄일지 봅니다.

구체적인 사례와 검증

처음에는 재고 1을 읽어 판매 가능하다고 판단했지만 다른 거래가 먼저 성공했다면 재시도 시 재고는 0일 수 있습니다. 이전 계산 결과를 그대로 저장하는 재시도는 새로운 상태에 맞지 않습니다. 재시도 함수는 transaction 생성부터 읽기·계산·쓰기·커밋까지 감싸고, 시도 밖에 유지할 논리 요청 ID와 시도 안에서 새로 읽을 값을 구분합니다. 한도를 넘으면 실패 사유와 재시도 가능성을 사용자에게 전달합니다. 시도별 로그에는 같은 요청 ID와 다른 시도 번호를 남겨 운영자가 한 사용자의 요청을 여러 주문으로 오해하지 않게 합니다. 영원히 충돌하는 핫키는 순차 실행이나 예약 모델로 바꿀지 검토합니다.

동시 부하에서 처음 시도와 최종 성공률, 재시도 횟수, 잠금·지연을 측정합니다. 재시도 때문에 유효한 요청이 무기한 굶지 않게 하며, 사용자가 보는 결과는 시도별 성공이 아니라 하나의 논리 거래 결과로 연결합니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: 직렬화 실패는 실행 이력 전체를 그대로 확정할 수 없다는 신호일 수 있어 보통 트랜잭션 전체를 새로 시작해야 합니다.
  • 선택 조건: 재시도 횟수와 전체 deadline을 제한하고 지터를 둡니다.
  • 검증 기준: 동시 부하에서 처음 시도와 최종 성공률, 재시도 횟수, 잠금·지연을 측정합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 직렬화 실패에서 마지막 SQL만 같은 입력으로 재실행한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 두 요청이 서로 다른 행만 바꾸는데도 전체 조건을 깨뜨릴 수 있다면 무엇을 함께 보호해야 하나요?
  • 성공 응답을 잃은 변경을 다시 실행하기 전에 어떤 논리 키와 결과 조회가 필요한가요?
  • DB 상태는 바뀌었지만 이벤트를 못 보낸 중단 지점을 어떻게 내구 기록으로 연결하나요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기