249. 2단계 커밋 (2PC, Two-Phase Commit) - 분산 트랜잭션 원자성 보장 프로토콜 코디네이터 참여자 Prepare Commit 블로킹 문제 데이터 동기화

핵심 인사이트: (248번 분산 트랜잭션의 멱살을 잡는 1대1 무전 통제술) "야! 248번에서 서울 DB랑 미국 DB가 텔레파시가 안 통해서 동시에 도장(COMMIT)을 못 찍고 돈이 증발했다며?! 당장 두 놈 사이에 절대 권력의 사령관(코디네이터) 1명을 세워!! 사령관이 무전기를 들고 서울, 미국한테 외친다. '야 ㅆㅂ 너희들 니들 맘대로 도장 찍지 마!! 1단계(준비 Prepare): 야 서울, 미국! 너희 둘 다 디스크에 글씨 쓸 준비 100% 완벽하게 끝났냐?! 아직 확정 도장(Commit)은 찍지 말고, 둘 다 나한테 장전 완료(Ready)됐다고 보고해!! 2단계(확정 Commit): 오케이, 방금 서울도 Ready, 미국도 Ready 사인 100% 떨어졌지? 좋았어, 내가 지금 [발사!!] 버튼 누를 테니까 그제야 너희 둘 동시에 도장(COMMIT) 쾅 찍어!! 만약 둘 중 한 놈이라도 1단계에서 [준비 안 됨(Abort)] 외치면, 나머지 한 놈도 발사 금지하고 즉각 무조건 롤백(Rollback) 때려!!'" 모두가 완벽하게 "YES"라고 대답할 때만 방아쇠를 당기는 만장일치 독재 투표 룰, 2단계 커밋(2PC)이다.

Ⅰ. 분산 환경의 눈치 게임 (누가 먼저 도장 찍을래?)

  • 10만 원을 서울에서 빼고 미국에 10만 원을 넣어야 합니다.
  • 서울이 "나 돈 뺐다! 확정(COMMIT)!" 하고 쿨하게 퇴근했는데, 미국 서버가 터져서 "어 난 에러 났어 롤백!" 하면 돈 10만 원은 허공에 증발합니다(원자성 박살).
  • 양쪽 노드가 서로 "네가 먼저 확정 도장 찍어봐"라며 눈치만 보다가 결국 모순이 터지는 이 병을 고쳐야 합니다.

Ⅱ. 2단계 커밋 (2PC, Two-Phase Commit)의 개념 🌟

  • 개념: 분산 데이터베이스 환경에서 여러 노드(서버)에 걸친 트랜잭션의 원자성(All or Nothing)을 완벽하게 보장하기 위해, 트랜잭션 완료(COMMIT) 과정을 단 1번의 쌩 무식한 도장 찍기가 아니라, '1단계(준비/투표)'와 '2단계(최종 확정/취소)'로 명확하게 쪼개어 100% 만장일치일 때만 데이터를 쇳덩어리에 영구 보존시키는 강력한 합의 프로토콜입니다.

Ⅲ. 2PC를 지휘하는 배역과 2단계 액션 🌟 핵심 기출 🌟

250번에서 더 자세히 배우겠지만, 배역은 딱 두 놈입니다. **코디네이터(사령관)**와 참여자(서울, 미국 서버들).

1단계: 준비 페이즈 (Prepare Phase) - "투표(Voting)의 시간"

  • 사령관이 서울과 미국에 쿼리를 던지고 묻습니다. "야! 너네 둘 다 디스크에 저장할 준비 100% 다 됐어?"
  • 서울과 미국은 엑셀을 고치고(Write), 236번 WAL 룰에 따라 로그 일기장까지 디스크에 안전하게 쾅 박아둡니다. 하지만 아직 최종 COMMIT 도장(자물쇠 풀기)은 절대 안 찍고 손에 무기를 든 채로 얼음! 상태로 대기합니다.
  • 서울: "저 준비 완료! (Ready/Vote Yes)"
  • 미국: "저도 준비 완료! (Ready/Vote Yes)"

2단계: 확정 페이즈 (Commit/Rollback Phase) - "만장일치의 방아쇠"

사령관이 1단계에서 걷은 투표용지를 깝니다. 경우의 수는 두 개입니다.

  • 상황 A (만장일치 YES): 사령관 "오케이, 너네 둘 다 100% 장전 끝났네. [글로벌 COMMIT] 발령!! 서울, 미국 너네 쥐고 있던 자물쇠 다 풀고 확정 지어라!!" (100% 성공 보장).
  • 상황 B (단 1명이라도 NO/무응답): 사령관 "야 ㅆㅂ! 서울은 Ready인데, 미국 새끼가 에러 나서 [Abort] 불렀네?! 이 미션은 실패다! [글로벌 ROLLBACK] 발령!! 서울 너도 아까 준비했던 거 당장 싹 다 찢어버려(Undo)!" (데이터 불일치 100% 원천 차단).

Ⅳ. 2PC의 끔찍한 한계: 숨 막히는 블로킹 지옥 🌟 (251, 252번 스포일러)

  • 비극의 시나리오 (사령관의 암살): 서울 서버가 "준비 완료(Ready)!"를 외치고 사령관의 2단계 [발사] 명령을 기다리며 모든 엑셀에 배타 락(X-Lock)을 꽉 쥐고 멈춰 서 있습니다.
  • 근데 그 찰나에 정중앙의 사령관(코디네이터) 놈이 심장마비(서버 다운)로 즉사해 버렸습니다!!
  • 서울 서버는 "어? 사령관님 왜 대답이 없지? 락(Lock)을 풀어야 돼, 말아야 돼?" 판단을 못 합니다.
  • 사령관이 다시 살아나서 무전을 쳐줄 때까지, 서울 서버는 영원히 자물쇠를 풀지 못하고 뻗정다리로 서서 무한 대기(Blocking)합니다! 그동안 서울 고객 10만 명은 모니터가 멈춘 채로 서버 폭동을 일으킵니다. 이 최악의 SPOF(단일 장애점)와 락(Lock) 병목 때문에 넷플릭스 같은 현대 MSA 아키텍처는 2PC를 **"절대 쓰면 안 되는 쓰레기 금기 기술"**로 지정하고 **Saga 패턴(252번)**으로 다 갈아타게 됩니다.

📢 섹션 요약 비유: **2단계 커밋(2PC)**은 헐리우드 액션 영화의 **'동시 핵가방 열쇠 돌리기 매뉴얼'**과 완벽히 똑같습니다. 서울 요원과 미국 요원이 각자 핵가방 열쇠를 쥐고 있습니다. 사령관(코디네이터)이 1명이라도 열쇠를 안 돌리면 미션 실패입니다. 1단계(Prepare): 사령관이 무전기로 외칩니다. "서울, 열쇠 꽂았나?" 서울 요원이 열쇠를 꽂고 대답합니다. "꽂았습니다! 돌릴 준비 완료(Ready)!" "미국, 꽂았나?" "꽂았습니다! 준비 완료(Ready)!" 요원들은 긴장한 채로 열쇠를 쥐고 1초라도 빨리 돌리고 싶지만, 땀을 흘리며(자물쇠 Lock 쥐고 대기) 사령관의 다음 명령을 무조건 기다려야 합니다. 2단계(Commit): 사령관이 양쪽의 Ready를 모두 확인한 뒤 소리칩니다. "좋아, 셋 셀 때 동시에 열쇠 돌린다! 셋, 둘, 하나, 돌려(글로벌 COMMIT)!!" 그제야 두 요원이 찰칵 열쇠를 돌리며 완벽한 타이밍에 미션을 성공시킵니다. 만약 1단계에서 미국 요원이 "악! 총 맞았어(Abort)!" 하면, 사령관은 "미션 취소! 서울 당장 열쇠 빼(ROLLBACK)!"라고 소리쳐 핵폭탄 오작동(데이터 불일치)을 완벽하게 막아냅니다. 하지만 1단계 땀을 흘리며 열쇠를 쥐고 있는 찰나에, 사령관이 저격수에게 맞아 통신이 끊기면(코디네이터 사망)? 요원들은 열쇠를 돌려야 할지 빼야 할지 몰라 화장실도 못 가고 영원히 가방만 쥐고 서 있는 미친 블로킹(무한 대기) 지옥에 빠져버리는 구시대 통신 규약의 치명적 한계입니다.