SET TRANSACTION は、現在のトランザクションの特性を設定します。SET SESSION CHARACTERISTICS は、セッション内で以降に実行されるすべてのトランザクションに対するデフォルトのトランザクション特性を設定します。SET TRANSACTION は、個別のトランザクションについてセッションレベルのデフォルト値をオーバーライドします。
概要
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
ここで、transaction_mode は以下のいずれかです。
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLEトランザクション特性
分離レベル
分離レベルは、他のトランザクションが同時に実行されている場合に、当該トランザクションがどのデータを参照できるかを制御します。
| レベル | 動作 | デフォルト |
|---|---|---|
READ COMMITTED | 各ステートメントは、そのステートメントの開始前にコミット済みの行のみを参照します。 | はい |
REPEATABLE READ | すべてのステートメントは、トランザクション内の最初のクエリまたはデータ変更ステートメントの開始前にコミット済みの行のみを参照します。 | いいえ |
SERIALIZABLE | REPEATABLE READ と同様の可視性を持ちます。同時実行可能な直列化可能トランザクションにより、シリアル(逐次)実行では発生し得ない状況が生じた場合、そのうちの 1 つが serialization_failure エラーでロールバックされます。 | いいえ |
READ UNCOMMITTED | SQL 標準で定義されたレベルですが、PostgreSQL では READ COMMITTED として扱われます。 | いいえ |
分離レベルは、トランザクション内で最初のクエリまたはデータ変更ステートメント(SELECT、INSERT、DELETE、UPDATE、MERGE、FETCH、または COPY)が実行された後には変更できません。
アクセスモード
アクセスモードは、トランザクションが読み取り/書き込み可能か、または読み取り専用かを決定します。デフォルトは READ WRITE です。
トランザクションが READ ONLY の場合、一時テーブル以外のテーブルに書き込む可能性がある以下のコマンドは許可されません。
INSERT、UPDATE、DELETE、MERGE、COPY FROM
以下のコマンドは、条件付きではなく無条件に禁止されます。
すべての
CREATE、ALTER、およびDROPコマンドCOMMENT、GRANT、REVOKE、TRUNCATEEXPLAIN ANALYZEおよびEXECUTE— ただし、それらが実行するコマンドが上記リストに含まれる場合に限ります
READ ONLY は高レベルの制約であり、ディスクへのすべての書き込みを防止するものではありません。DEFERRABLE
DEFERRABLE は、トランザクションが同時に SERIALIZABLE および READ ONLY でない限り、効果を発揮しません。この3つのプロパティがすべて設定されている場合、トランザクションは最初にスナップショットを取得する際にブロックされる可能性がありますが、その後は SERIALIZABLE トランザクションの通常のオーバーヘッドなしで実行され、シリアル化失敗への寄与やシリアル化失敗によるキャンセルのリスクもありません。この組み合わせは、長時間実行されるレポートやバックアップに最適です。
スナップショット
SET TRANSACTION SNAPSHOT を使用すると、新しいトランザクションを既存のトランザクションと同じスナップショットで実行できます。既存のトランザクションは、pg_export_snapshot() を使用してスナップショットをエクスポートする必要があります。この関数はスナップショット識別子を返します。その識別子を文字列リテラルとして SET TRANSACTION SNAPSHOT に渡します。
制約事項:
トランザクション内で最初のクエリまたはデータ変更ステートメントを実行する前に、
SET TRANSACTION SNAPSHOTを実行してください。トランザクションは
SERIALIZABLEまたはREPEATABLE READの分離レベルを使用する必要があります。READ COMMITTEDの場合、各コマンドが新しいスナップショットを取得するため、インポートされたスナップショットは即座に破棄されます。インポート側のトランザクションが
SERIALIZABLEを使用する場合、エクスポート側のトランザクションもSERIALIZABLEを使用する必要があります。読み取り専用ではない直列化可能トランザクションは、読み取り専用トランザクションからスナップショットをインポートできません。
注意事項
SET TRANSACTIONを実行する前にSTART TRANSACTIONまたはBEGINが実行されていない場合、警告が表示され、処理は行われません。SET TRANSACTIONを回避するには、transaction_modeの値を直接BEGINまたはSTART TRANSACTIONに指定します。ただし、この代替方法はSET TRANSACTION SNAPSHOTには適用されません。セッションレベルのデフォルト値は、構成パラメーター
default_transaction_isolation、default_transaction_read_only、およびdefault_transaction_deferrableを介しても設定可能です。SET SESSION CHARACTERISTICSは、これらのパラメーターをSETで設定することと等価です。つまり、デフォルト値は構成ファイルやALTER DATABASEなどによって設定できます。
例
トランザクション間でのスナップショット共有
既存のトランザクションからスナップショットをエクスポートします。
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
pg_export_snapshot
---------------------
00000003-0000001B-1
(1 row)新しいトランザクションでスナップショットをインポートします。
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';