분산 트랜잭션의 복구 방식

실패 지점 이전에 성공한 단계만, 새 역방향 트랜잭션으로 되돌립니다

여러 서비스에 걸친 주문 처리에서는 하나의 ACID ROLLBACK으로 전체를 취소하기 어렵습니다. 그래서 흐름이 중간에서 실패하면 이미 반영된 변경만 골라 업무 의미를 반대로 수행하는 보상 트랜잭션을 실행합니다.

읽는 법

위 행은 정방향 처리, 아래 행은 실패 후 복구입니다. 실패한 단계는 보상의 출발점이고, 아직 실행되지 않은 단계는 되돌릴 대상이 아닙니다.

정방향 실행
주문이 1 → 2 → 3 → 4 순서로 진행됩니다.
1단계 성공
주문 서비스
주문 생성
주문 레코드를 만들고 처리 흐름을 시작합니다.
2단계 성공
결제 서비스
결제 승인
카드 승인처럼 실제 금전 상태가 먼저 바뀝니다.
3단계 실패
재고 서비스
재고 차감 실패
재고 부족이 확인되면 여기서 정방향 흐름이 멈춥니다.
4단계 미실행
배송 서비스
배송 요청 안 함
실패 이후 단계는 시작하지 않았으므로 영향이 없습니다.
실패 후 보상
실패 지점에서 역순으로, 성공했던 단계만 논리적으로 복구합니다.
2차 보상
주문 서비스
주문 취소
생성된 주문 상태를 취소로 바꿔 전체 결과를 맞춥니다.
1차 보상
결제 서비스
승인 취소 또는 환불
이미 승인된 결제를 반대 의미의 새 트랜잭션으로 되돌립니다.
출발점
재고 서비스
실패 감지
여기서부터 어떤 단계를 되돌릴지 결정됩니다.
대상 아님
배송 서비스
보상 불필요
애초에 실행되지 않았으므로 취소할 작업도 없습니다.
핵심 차이
보상 트랜잭션은 Undo 로그로 자동 롤백하는 기능이 아닙니다. 출금의 보상이 입금이고, 재고 차감의 보상이 재고 추가이듯 업무적으로 반대 의미의 새 트랜잭션을 실행해 최종 일관성을 회복합니다.