74.1. トランザクションと識別子 #

トランザクションは、BEGINまたはSTART TRANSACTIONを使用して明示的に作成し、COMMITまたはROLLBACKを使用して終了します。 明示的なトランザクションの外側のSQL文は、自動的に単一文トランザクションを使用します。

各トランザクションは、一意のVirtualTransactionId(あるいはvirtualXIDまたはvxidとも呼ばれます)で識別します。 これは、バックエンドID(またはbackendID)と、localXIDと呼ばれる各バックエンドに固有の連続した番号で構成されます。 たとえば、仮想トランザクションID4/12532backendID4で、localXID12532です。

非仮想TransactionId(またはxid)、例えば278394は、PostgreSQLクラスタ内のすべてのデータベースが使用するグローバルカウンタからトランザクションに順番に割り当てられます。 この割り当ては、トランザクションがデータベースに最初に書き込みを行ったときに行われます。 これは、低い番号のxidが、より大きな番号のxidよりも前に書き込みを開始したことを意味します。 トランザクションが最初にデータベースに書き込みを行った順序は、トランザクションの開始順序とは異なるかもしれないことに注意してください。 特に、トランザクションがデータベース読み取りのみを実行する文で開始した場合にはそうなります。

内部トランザクションID型xidは32ビット幅で、40億トランザクションごとに周回します。 32ビットエポックは各周回ごとに加算されます。 また、このエポックを含むために、インストールの寿命中には周回しない64ビット型xid8もあり、キャストでxidに変換できます。 表 9.80の関数はxid8値を返します。 XIDはPostgreSQLMVCC同時実行機構とストリーミングレプリケーションの基礎として使用されます。

(非仮想)xidを持つトップレベルのトランザクションがコミットすると、pg_xactディレクトリにコミット済みとしてマークされます。 track_commit_timestampが有効な場合、追加情報がpg_commit_tsディレクトリに記録されます。

vxidxidに加えて、準備されたトランザクションにはグローバルトランザクション識別子(GID)も割り当てられます。 GIDは最大200バイト長の文字列リテラルで、現在準備されている他のトランザクション中で一意でなければなりません。 GIDからxidへのマッピングはpg_prepared_xactsに表示されます。