Untitled

고개 서비스와 이체 서비스가 있는데, 만약 CUSTID 가 “0001”인 고객이 탈퇴한다고 가정했을 때, 이체 서비스에서 관리하고 있는 이체 내역 TB에 CUSTID 인 고객 정보가 삭제되어야 한다고 가정

모놀로틱에서는 하나의 트랜잭션 범위에서 수행되기 때문에 모두 반영되거나 모두 반영되지 않음 → 원자성을 보장

그러나 두 서비스에서는 두 개의 트랜잭션으로 나눠서 동작을 하기 때문에 원자성을 보장할 수 없음

그래서 분산 시스템에서 트랜잭션을 보장하기 위해서 2PC, Saga pattern 두 가지가 있음

2Phase Commit(2PC)

Untitled

한 개의 코디네이터(트랜잭션 매니저)와 여러 개의 참여자들로 나눠짐

코디네이터(트랜잭션 매니저)를 사용 → 코디네이터는 커밋할 트랜잭션을 만드는 노드

참여자(분산된 서비스 노드)는 코디네이터가 보낸 트랜잭션을 커밋하거나 롤백함

2PC는 말 그대로 2개의 페이지로 나눠져 있음

  1. 분산 트랜잭션을 시작하길 원하면, 코디네이터에게 트랜잰션 ID를 요청 → 이때 트랜잭션 ID는 글로벌적으로 유니크함
  2. 분산 트랜잭션에 참여하는 참여자들에게 1번에서 생성한 트랜잭션 ID가 포함된 Prepare 요청을 보냄
  3. 각 참여자들이 Prepare 요청을 받고 “OK”를 응답하면 참여자가 코디네이터에게 어떠한 에러도 없이 커밋될 수 있다는 것을 약속함
  4. 코디네이터는 모든 참여자들로부터 Prepare 요청에 대해서 응답을 받으면 commit을 할지 abort를 할지 결정 → 하나라도 OK가 아니라면 abort임
  5. 코디네이터는 결정사항을 각 참여자들에게 전달→ 이때 결정 사항이 commit이든 abort이든 각 참여자들은 무조건 해당 결정을 수행해야 함

여기서 특징은 2PC에서 2가지 번복 없는 포인트를 가지게 되는데 prepare 단계에서 OK를 응답하면 반드시 커밋을 해야하며, commit 단계에서 코디네이터에 의한 결정을 무조건 따라야 한다는 것