PREPARE TRANSACTION — 二相コミット用に現在のトランザクションを準備する
PREPARE TRANSACTION transaction_id
PREPARE TRANSACTION
は、二相コミット用に現在のトランザクションを準備します。
このコマンドの後、トランザクションは現在のセッションと関連しなくなります。
トランザクションの状態は完全にディスク上に保存され、コミット要求前にデータベースがクラッシュしてしまったとしても、ほぼ確実に正常にコミットできるようになります。
準備された後、そのトランザクションをCOMMIT PREPAREDによりコミット、あるいはROLLBACK PREPAREDによりロールバックすることができます。 元のトランザクションを実行したセッションだけではなく、任意のトランザクションからこれらのコマンドを発行することができます。
コマンドを発行したセッションから見ると、PREPARE TRANSACTION
はROLLBACK
コマンドと似たような動作をします。
実行した後、実行中の現在のトランザクションはなくなり、準備したトランザクションの効果は不可視になります。
(そのトランザクションがコミットされた場合に効果が可視になります。)
何らかの原因でPREPARE TRANSACTION
コマンドが失敗した場合、ROLLBACK
が行われます。
つまり、現在のトランザクションが取り消されます。
transaction_id
後でCOMMIT PREPARED
やROLLBACK PREPARED
でトランザクションを識別するための任意の識別子です。
この識別子は文字列リテラルでなければなりません。また、200バイト未満でなければなりません。
また、その時点で準備されたトランザクションとして使用されている他の識別子と同じものは使用できません。
PREPARE TRANSACTION
はアプリケーションや対話式のセッションでの使用を目的としていません。
この目的は、外部トランザクションマネージャにより、複数のデータベースやその他のトランザクションを持つリソースを跨るグローバルなトランザクションを原子的に実現できるようにすることです。
トランザクションマネージャを作成しているのでなければ、おそらくPREPARE TRANSACTION
を使用するべきではありません。
このコマンドはトランザクションブロック内で使用しなければなりません。 トランザクションブロックを始めるには、BEGINを使用してください。
現時点では、一時テーブルを含む操作を行ったトランザクション、カーソルをWITH HOLD
で作成したトランザクション、LISTEN
、UNLISTEN
またはNOTIFY
を実行したトランザクションをPREPARE
させることはできません。
準備したトランザクションで便利に使用するには、これらの機能は現在のセッションにあまりに強く結びついているためです。
トランザクションで何らかの実行時パラメータが(LOCAL
オプションなしの)SET
で設定されている場合、その影響はPREPARE TRANSACTION
の後も残ります。
また、その後のCOMMIT PREPARED
やROLLBACK PREPARED
の影響を受けません。
したがって、この意味では、PREPARE TRANSACTION
はROLLBACK
よりCOMMIT
と似た動きであるといえます。
その時点で利用できるすべての準備されたトランザクションはpg_prepared_xacts
システムビューで列挙されます。
トランザクションを長期間準備された状態のままとすることは勧められません。
これは格納領域を回収するVACUUM
機能を妨害し、極端な場合では、トランザクションの周回(24.1.5参照)を回避するためにデータベースを停止させてしまいます。
またトランザクションが保持しているすべてのロックを保持し続けていることにも注意してください。
この機能の想定している使用方法は、外部トランザクションマネージャが他のデータベースがコミットの準備をしたと検証した後すぐに、準備されたトランザクションは通常コミットまたはロールバックされることです。
準備されたトランザクションを追跡し、それを即座に終了できるように外部トランザクションマネージャを設定していない場合、max_prepared_transactionsをゼロに設定して準備されたトランザクション機能を無効にしておくことが最善です。 こうすれば事故により準備されたトランザクションが作成され、それが忘れられて問題を引き起こすことを防止できます。
二相コミット用に現在のトランザクションを準備します。
トランザクション識別子としてfoobar
を使用します。
PREPARE TRANSACTION 'foobar';
PREPARE TRANSACTION
はPostgreSQLの拡張です。
これは外部のトランザクション管理システムによる利用を意図したものです。
トランザクション管理システムの一部(X/Open XAなど)は標準化されていますが、こうしたシステムのSQL側は標準化されていません。