분산 트랜잭션(Distributed Transaction)은 여러 데이터베이스나 서비스에 걸쳐 원자적으로 실행되어야 하는 트랜잭션이다. 하나라도 실패하면 전체가 롤백되어야 하므로 단일 DB의 ACID와 달리 구현이 복잡하다.
문제의 본질
모놀리식: DB1 하나 → ACID 트랜잭션으로 원자성 보장
마이크로서비스:
주문 DB, 결제 DB, 재고 DB가 분리
→ "모두 성공" 또는 "모두 실패"를 어떻게 보장?
2PC (Two-Phase Commit)
전통적인 분산 트랜잭션 프로토콜.
Phase 1: 준비 (Prepare)
코디네이터 → 모든 참여자: "커밋할 준비됐어?"
참여자 → 코디네이터: "YES" 또는 "NO"
Phase 2: 커밋/롤백 (Commit/Abort)
모두 YES → 코디네이터 → 모든 참여자: "커밋해!"
하나라도 NO → 코디네이터 → 모든 참여자: "롤백해!"
2PC의 문제점
- •가용성: 코디네이터 장애 시 참여자가 블로킹
- •성능: 2번의 왕복 통신 필요
- •확장성: 많은 참여자 → 잠금 시간 증가
현대적 접근법
Outbox 패턴
python
# DB 트랜잭션 + 이벤트 발행 원자성 보장
with db.transaction():
# 비즈니스 로직
order = create_order(data)
db.save(order)
# 같은 트랜잭션에 이벤트 저장
db.save(OutboxEvent("OrderCreated", order.id))
# 별도 프로세스가 Outbox 폴링 → 메시지 큐 발행
관련 개념
- •SAGA 패턴 — 분산 트랜잭션의 현대적 해결책
- •두 단계 커밋 — 2PC 상세
- •CAP 정리 — 분산 시스템의 근본 제약
- •ACID — 단일 DB 트랜잭션 속성