PREPARE TRANSACTIONは、二相コミット用に現在のトランザクションを準備します。 このコマンドの後、トランザクションは現在のセッションと関連しなくなります。 トランザクションの状態は完全にディスク上に保存され、コミット要求前にデータベースがクラッシュしてしまったとしても、ほとんど確実に正常にコミットできるようになります。
準備された後、そのトランザクションをCOMMIT PREPAREDやROLLBACK PREPAREDによりコミットまたはロールバックすることができます。 元のトランザクションを実行したセッションだけではなく、任意のトランザクションからこれらのコマンドを発行することができます。
コマンドを発行したセッションから見ると、PREPARE TRANSACTIONはROLLBACKコマンドと似たような動作をします。 実行した後、実行中の現在のトランザクションはなくなり、準備したトランザクションの効果は不可視になります。 (そのトランザクションがコミットされた場合に効果が可視になります。)
何らかの原因でPREPARE TRANSACTIONコマンドが失敗した場合、ROLLBACKが行われます。 つまり、現在のトランザクションが取り消されます。
後でCOMMIT PREPAREDやROLLBACK PREPAREDでトランザクションを識別するための任意の識別子です。 この識別子は文字列リテラルでなければなりません。また、200バイト未満でなければなりません。 また、その時点で準備されたトランザクションとして使用されている他の識別子と同じものは使用できません。
このコマンドはトランザクションブロック内で使用しなければなりません。 トランザクションブロックを始めるには、BEGINを使用してください。
現時点では、一時テーブルを含む操作を行うトランザクションやカーソルをWITH HOLDで作成するトランザクション、LISTENまたはUNLISTENを実行するトランザクションをPREPAREさせることはできません。 準備したトランザクションで便利に使用するには、これらの機能は現在のセッションにあまりに強く結びついているためです。
トランザクションで何らかの実行時パラメータが(LOCALオプションなしの)SETで設定されている場合、その影響はPREPARE TRANSACTIONの後も残ります。 また、COMMIT PREPAREDやROLLBACK PREPAREDの後では、その影響はありません。 したがって、この意味では、PREPARE TRANSACTION はROLLBACKよりCOMMITと似た動きであるといえます。
その時点で利用できるすべての準備されたトランザクションはpg_prepared_xactsシステムビューで列挙されます。
性能という点では、トランザクションを長時間準備段階に保持することは推奨できません。 具体的には、これはVACUUMで格納領域を回収する能力に影響します。 また、トランザクションが保持している何らかのロックを保持し続けることも考慮してください。 準備されたトランザクションは通常、別のトランザクションマネージャが他のデータベースでコミットの準備ができたことを確認したらすぐにコミットまたはロールバックされるといった使用方法を想定しています。
準備されたトランザクションを本格的に使用する場合、(使用しない人にとっての無駄なリソース消費を防ぐために)デフォルトの設定では小さすぎますので、max_prepared_transactionsの値を増やさなければならないかもしれません。 少なくとも、すべてのセッションが準備されたトランザクションを待機できるように、max_connectionsと同値にすることを勧めます。