[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

PREPARE TRANSACTION

PREPARE TRANSACTION — 二相コミット用に現在のトランザクションを準備する

概要

PREPARE TRANSACTION transaction_id

説明

PREPARE TRANSACTIONは、二相コミット用に現在のトランザクションを準備します。 このコマンドの後、トランザクションは現在のセッションと関連しなくなります。 トランザクションの状態は完全にディスク上に保存され、コミット要求前にデータベースがクラッシュしてしまったとしても、ほぼ確実に正常にコミットできるようになります。

準備された後、そのトランザクションをCOMMIT PREPAREDによりコミット、あるいはROLLBACK PREPAREDによりロールバックすることができます。 元のトランザクションを実行したセッションだけではなく、任意のトランザクションからこれらのコマンドを発行することができます。

コマンドを発行したセッションから見ると、PREPARE TRANSACTIONROLLBACKコマンドと似たような動作をします。 実行した後、実行中の現在のトランザクションはなくなり、準備したトランザクションの効果は不可視になります。 (そのトランザクションがコミットされた場合に効果が可視になります。)

何らかの原因でPREPARE TRANSACTIONコマンドが失敗した場合、ROLLBACKが行われます。 つまり、現在のトランザクションが取り消されます。

パラメータ

transaction_id

後でCOMMIT PREPAREDROLLBACK PREPAREDでトランザクションを識別するための任意の識別子です。 この識別子は文字列リテラルでなければなりません。また、200バイト未満でなければなりません。 また、その時点で準備されたトランザクションとして使用されている他の識別子と同じものは使用できません。

注釈

PREPARE TRANSACTIONはアプリケーションや対話式のセッションでの使用を目的としていません。 この目的は、外部トランザクションマネージャにより、複数のデータベースやその他のトランザクションを持つリソースを跨るグローバルなトランザクションを原子的に実現できるようにすることです。 トランザクションマネージャを作成しているのでなければ、おそらくPREPARE TRANSACTIONを使用するべきではありません。

このコマンドはトランザクションブロック内で使用しなければなりません。 トランザクションブロックを始めるには、BEGINを使用してください。

現時点では、一時テーブルもしくはセッションの一時的な名前空間を含む操作を行ったトランザクション、カーソルをWITH HOLDで作成したトランザクション、LISTENUNLISTENまたはNOTIFYを実行したトランザクションをPREPAREさせることはできません。 準備したトランザクションで便利に使用するには、これらの機能は現在のセッションにあまりに強く結びついているためです。

トランザクションで何らかの実行時パラメータが(LOCALオプションなしの)SETで設定されている場合、その影響はPREPARE TRANSACTIONの後も残ります。 また、その後のCOMMIT PREPAREDROLLBACK PREPAREDの影響を受けません。 したがって、この意味では、PREPARE TRANSACTIONROLLBACKよりCOMMITと似た動きであるといえます。

その時点で利用できるすべての準備されたトランザクションはpg_prepared_xactsシステムビューで列挙されます。

注意

トランザクションを長期間準備された状態のままとすることは勧められません。 これは格納領域を回収するVACUUM機能を妨害し、極端な場合では、トランザクションの周回(24.1.5参照)を回避するためにデータベースを停止させてしまいます。 またトランザクションが保持しているすべてのロックを保持し続けていることにも注意してください。 この機能の想定している使用方法は、外部トランザクションマネージャが他のデータベースがコミットの準備をしたと検証した後すぐに、準備されたトランザクションは通常コミットまたはロールバックされることです。

準備されたトランザクションを追跡し、それを即座に終了できるように外部トランザクションマネージャを設定していない場合、max_prepared_transactionsをゼロに設定して準備されたトランザクション機能を無効にしておくことが最善です。 こうすれば事故により準備されたトランザクションが作成され、それが忘れられて問題を引き起こすことを防止できます。

二相コミット用に現在のトランザクションを準備します。 トランザクション識別子としてfoobarを使用します。

PREPARE TRANSACTION 'foobar';

互換性

PREPARE TRANSACTIONPostgreSQLの拡張です。 これは外部のトランザクション管理システムによる利用を意図したものです。 トランザクション管理システムの一部(X/Open XAなど)は標準化されていますが、こうしたシステムのSQL側は標準化されていません。

関連項目

COMMIT PREPARED, ROLLBACK PREPARED