나의 잡다한 노트 및 메모

PREPARE TRANSACTION 본문

DB/PostgreSQL

PREPARE TRANSACTION

peanutwalnut 2025. 7. 30. 12:40

 

구분           설명

정의 PostgreSQL가 제공하는 이단계 커밋(Two‑Phase Commit, 2PC) 프로토콜의 1단계 명령. 트랜잭션을 “준비(prepare)” 상태로 기록해 두고, 최종 커밋 또는 롤백을 나중에 결정할 수 있게 만든다.
형식 PREPARE TRANSACTION 'gid';▶ gid = 전역 트랜잭션 ID(문자열)
역할 ① 트랜잭션 내용을 WAL과 시스템 카탈로그에 영구 기록② 모든 변경이 디스크에 fsync 됐음을 보장③ 세션이 종료돼도 트랜잭션 잠금·리소스가 유지되어, 장애가 나더라도 2단계를 재시도할 수 있음
2단계 COMMIT PREPARED 'gid'; 또는 ROLLBACK PREPARED 'gid';

 

 

왜 이게 Citus / 분산 환경에서 중요할까? 

 

단계              Coordinator‑Worker 흐름 (예: DELETE)

1 Coordinator가 워커마다 로컬 트랜잭션 수행
**2 워커가 PREPARE TRANSACTION 'gid' 실행 → “준비됨” 상태 보고**
3 모든 워커가 준비 OK면 Coordinator가 COMMIT PREPARED 브로드캐스트
4 어느 워커라도 실패하면 Coordinator가 ROLLBACK PREPARED 해 일괄 취소

모든 샤드가 전부 커밋 또는 전부 롤백을 보장하는 핵심 매커니즘.

 

시스템 뒷면에서 일어나는 일

  1. pg_prepared_xacts
    준비된 트랜잭션 메타데이터는 이 시스템 카탈로그에 기록된다.
     
    SELECT gid, database, prepared, owner, transaction, forced_commit FROM pg_prepared_xacts;
  2. WAL 로그 기록
    prepare 레코드가 WAL에 남아 복구 시점에도 재생된다.
  3. 락 유지
    테이블·행 락이 그대로 묶여 있어 다른 세션 접근을 차단한다.

장점 · 주의점

장점                                                                             주의점 / 운영 팁

 

‑ 네트워크·노드 장애 중에도 분산 일관성 보존 • 준비만 된 채 COMMIT/ROLLBACK 안 하면 락이 영구 고착
  → 모니터링으로 잔류 GID가 없는지 주기 점검
‑ 장애 복구 후 재시도만으로 트랜잭션 완결 • pg_prepared_xacts 에 1시간 이상 남아 있으면 수동 정리
  ROLLBACK PREPARED 'gid';
‑ Citus, PGPool‑II, 외부 XA 드라이버 등과 호환 • VACUUM FREEZE, DDL 등 장기 락을 요구하는 작업과 충돌 가능

 

-- 1) 현재 준비 상태 트랜잭션 확인
SELECT * FROM pg_prepared_xacts;

-- 2) 특정 GID 강제 커밋
COMMIT PREPARED 'gid';

-- 3) 특정 GID 강제 롤백
ROLLBACK PREPARED 'gid';

 

 

정리하면 PREPARE TRANSACTION은 2PC의 1단계이고, 모두 준비됐는지 확인하고 멈춘다

CITUS 분산 DELETE, INSERT 등에서 샤드마다 prepare -> 모든 노드 OK -> commit Prepared 순으로 동작한다.

준비상태가 방치되면 락 경합이 생길 수 있으니 pg_prepared_xacts 모니터링이 필수다.

 

 

'DB > PostgreSQL' 카테고리의 다른 글

PG의 wal_level 설정  (3) 2025.07.30
PostgreSQL 아키텍쳐 및 컴포넌트  (2) 2025.07.29
pg_hba 란?  (0) 2025.03.25
Patroni의 명령어  (0) 2025.03.25
PostgreSQL 베어메탈 환경에서 설치  (0) 2025.03.02