분산 트랜잭션의 핵심

각 DB는 먼저 준비만 하고 멈춥니다. 최종 결정은 코디네이터가 한 번에 내립니다.

2PC는 여러 데이터베이스가 따로 놀지 않게, 함께 준비한 뒤 같은 결과를 적용하도록 묶는 방식입니다.

공유 요청

하나의 비즈니스 작업이 여러 DB를 동시에 바꿉니다.

주문 DB 주문 레코드 생성 예정
결제 DB 승인 레코드 반영 예정

트랜잭션은 하나처럼 보이지만, 실제 변경은 서비스별 로컬 DB에 흩어져 있습니다.

1. Prepare

참여자들은 로컬 변경을 준비하고, 아직 commit하지 않은 채 YES 또는 NO만 보냅니다.

주문 DB 참여자 변경 가능 여부 확인

주문 상태를 쓸 준비를 마치고, 잠금을 유지한 채 응답합니다.

결제 DB 참여자 로컬 트랜잭션 준비

결제 기록을 반영할 수 있는지 검사한 뒤, YES 또는 NO를 반환합니다.

공통 대기 구간 YES를 보냈어도 혼자 commit하지 못합니다. 코디네이터의 최종 명령이 올 때까지 잠금과 상태를 그대로 유지합니다.
2. Decide + Apply

코디네이터가 응답을 모아 하나의 결과를 전체에 전파합니다.

전원 YES인가? 판단은 중앙에서 한 번만 하고, 참여자들은 같은 명령을 함께 적용합니다.
모두 준비됨 전체 COMMIT

주문 DB도 commit, 결제 DB도 commit. 분산된 변경이 하나의 성공 결과로 맞춰집니다.

하나라도 실패 전체 ROLLBACK

한 참여자라도 NO면 모두 되돌립니다. 부분 성공 상태를 남기지 않는 것이 핵심입니다.

핵심 정리

2PC는 각 DB가 제각각 commit하는 방식이 아니라, 함께 준비하고 함께 확정해서 일관성을 지키는 구조입니다. 대신 Prepare 이후에는 대기와 잠금이 생깁니다.