나의 잡다한 노트 및 메모
PREPARE TRANSACTION 본문
구분 설명
정의 | 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 해 일괄 취소 |
모든 샤드가 전부 커밋 또는 전부 롤백을 보장하는 핵심 매커니즘.
시스템 뒷면에서 일어나는 일
- pg_prepared_xacts
준비된 트랜잭션 메타데이터는 이 시스템 카탈로그에 기록된다.SELECT gid, database, prepared, owner, transaction, forced_commit FROM pg_prepared_xacts; - WAL 로그 기록
prepare 레코드가 WAL에 남아 복구 시점에도 재생된다. - 락 유지
테이블·행 락이 그대로 묶여 있어 다른 세션 접근을 차단한다.
장점 · 주의점
장점 주의점 / 운영 팁
‑ 네트워크·노드 장애 중에도 분산 일관성 보존 | • 준비만 된 채 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 |