PREPARE TRANSACTION
PREPARE TRANSACTION
현재 트랜잭션을 2단계 커밋(two-phase commit)을 위해 준비하는 명령이에요. 트랜잭션의 상태를 디스크에 완전히 저장해 두고, 이후 어떤 세션에서든 COMMIT PREPARED나 ROLLBACK PREPARED로 마무리할 수 있게 해요. 분산 트랜잭션 관리자가 여러 데이터베이스에 걸친 원자적 전역 트랜잭션을 조율할 때 사용해요.
출처: PostgreSQL 문서
본문
개요 (Synopsis)
PREPARE TRANSACTION transaction_id
설명 (Description)
PREPARE TRANSACTION은 2단계 커밋을 위해 현재 트랜잭션을 준비해요. 이 명령 다음에는 트랜잭션이 더 이상 현재 세션과 연결되지 않아요. 그 대신 그 상태가 디스크에 완전히 저장되고, 커밋이 요청되기 전에 데이터베이스가 충돌하더라도 성공적으로 커밋될 가능성이 매우 높아요.
일단 준비되면 트랜잭션은 나중에 각각 COMMIT PREPARED나 ROLLBACK PREPARED로 커밋되거나 롤백될 수 있어요. 이 명령들은 원래 트랜잭션을 실행한 세션뿐 아니라 어떤 세션에서도 발행할 수 있어요.
발행 세션의 관점에서 PREPARE TRANSACTION은 ROLLBACK 명령과 크게 다르지 않아요. 실행한 뒤에는 활성 현재 트랜잭션이 없고, 준비된 트랜잭션의 효과가 더 이상 보이지 않아요. (트랜잭션이 커밋되면 그 효과가 다시 보이게 돼요.)
어떤 이유로든 PREPARE TRANSACTION 명령이 실패하면 그것은 ROLLBACK이 돼요. 즉 현재 트랜잭션이 취소돼요.
파라미터 (Parameters)
*transaction_id* — 나중에 COMMIT PREPARED나 ROLLBACK PREPARED에서 이 트랜잭션을 식별하는 임의의 식별자예요. 식별자는 문자열 리터럴로 써야 하며 200바이트보다 짧아야 해요. 현재 준비된 어떤 트랜잭션에 사용된 식별자와 같아서는 안 돼요.
참고 (Notes)
PREPARE TRANSACTION은 애플리케이션이나 대화형 세션에서 사용하기 위한 것이 아니에요. 그 목적은 외부 트랜잭션 관리자가 여러 데이터베이스나 다른 트랜잭션 리소스에 걸친 원자적 전역 트랜잭션을 수행할 수 있게 하는 것이에요. 트랜잭션 관리자를 작성하는 것이 아니라면 아마 PREPARE TRANSACTION을 사용하지 않아야 해요.
이 명령은 트랜잭션 블록 안에서 사용해야 해요. 시작하려면 BEGIN을 사용하세요.
현재 임시 테이블이나 세션의 임시 네임스페이스를 포함하는 연산을 실행했거나, WITH HOLD 커서를 만들었거나, LISTEN, UNLISTEN, NOTIFY를 실행한 트랜잭션을 PREPARE하는 것은 허용되지 않아요. 이런 기능은 현재 세션에 너무 밀접하게 묶여 있어서 준비될 트랜잭션에 유용하지 않아요.
트랜잭션이 SET(LOCAL 옵션 없이)으로 어떤 런타임 파라미터를 수정했다면, 그 효과는 PREPARE TRANSACTION 후에도 지속되고 이후의 COMMIT PREPARED나 ROLLBACK PREPARED는 그것에 영향을 주지 않아요. 따라서 이 한 가지 점에서 PREPARE TRANSACTION은 ROLLBACK보다 COMMIT처럼 동작해요.
현재 사용 가능한 모든 준비된 트랜잭션은 pg_prepared_xacts 시스템 뷰에 나열돼요.
CAUTION:
트랜잭션을 오랫동안 준비된 상태로 두는 것은 현명하지 않아요. 이것은
VACUUM이 저장 공간을 회수하는 능력을 방해하며, 극단적인 경우 트랜잭션 ID 래핑을 방지하기 위해 데이터베이스가 종료될 수도 있어요(24.1.5절 참고). 트랜잭션이 보유하고 있던 락을 계속 보유한다는 점도 명심하세요. 이 기능의 의도된 사용법은, 외부 트랜잭션 관리자가 다른 데이터베이스도 커밋할 준비가 되었음을 확인하는 즉시 준비된 트랜잭션이 보통 커밋되거나 롤백되는 거예요.준비된 트랜잭션을 추적하고 신속히 정리하도록 보장하는 외부 트랜잭션 관리자를 설정하지 않았다면,
max_prepared_transactions를 0으로 설정해 준비된 트랜잭션 기능을 비활성화해 두는 것이 가장 좋아요. 이렇게 하면 나중에 잊혀져 결국 문제를 일으킬 수 있는 준비된 트랜잭션이 우연히 만들어지는 것을 막을 수 있어요.
예제 (Examples)
foobar를 트랜잭션 식별자로 사용해 2단계 커밋을 위해 현재 트랜잭션을 준비하려면:
PREPARE TRANSACTION 'foobar';
호환성 (Compatibility)
PREPARE TRANSACTION은 PostgreSQL 확장이에요. 그것은 외부 트랜잭션 관리 시스템에서 사용하기 위한 것으로, 그중 일부는 표준(X/Open XA 등)으로 다뤄지지만 그 시스템의 SQL 쪽은 표준화되지 않았어요.
더 알아보기 (Learn more)
준비된 트랜잭션을 커밋하거나 중단하는 방법은 COMMIT PREPARED와 ROLLBACK PREPARED 문서를, 준비된 트랜잭션을 조회하는 방법은 pg_prepared_xacts 시스템 뷰를 함께 보면 좋아요.