PostgreSQL 9.0.0文書
前のページ | 巻戻し |  | 早送り | 次のページ

# PREPARE TRANSACTION

## 名前

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`を実行するトランザクションを`PREPARE`させることはできません。 準備したトランザクションで便利に使用するには、これらの機能は現在のセッションにあまりに強く結びついているためです。

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

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

注意
トランザクションを長期間準備された状態のままとすることは勧められません。 これは格納領域を回収する`VACUUM`機能と相互作用し、極端な場合では、トランザクションの周回（項23.1.4参照）を回避するためにデータベースを停止させてしまいます。 またトランザクションが保持している何からのロックを保持し続けていることにも注意してください。 外部トランザクションマネージャが他のデータベースがコミットの準備をしたと検証した後すぐに、準備されたトランザクションは通常コミットまたはロールバックされることがこの機能の想定している使用方法です。 準備されたトランザクションを追跡し、その終了を即座に確認できるように外部トランザクションマネージャを設定していない場合、max_prepared_transactionsをゼロに設定して準備されたトランザクション機能を無効にしておくことが最善です。 こうすれば事故により準備されたトランザクションが作成され、忘れられた結果問題を引き起こすことを防ぐことができます。

## 例

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

    PREPARE TRANSACTION 'foobar';

## 関連項目

COMMIT PREPARED, ROLLBACK PREPARED

前のページ | ホーム | 次のページ
PREPARE | 上に戻る | REASSIGN OWNED