すべてのプロダクト
Search
ドキュメントセンター

PolarDB:SET TRANSACTION

最終更新日:Mar 29, 2026

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すべてのステートメントは、トランザクション内の最初のクエリまたはデータ変更ステートメントの開始前にコミット済みの行のみを参照します。いいえ
SERIALIZABLEREPEATABLE READ と同様の可視性を持ちます。同時実行可能な直列化可能トランザクションにより、シリアル(逐次)実行では発生し得ない状況が生じた場合、そのうちの 1 つが serialization_failure エラーでロールバックされます。いいえ
READ UNCOMMITTEDSQL 標準で定義されたレベルですが、PostgreSQL では READ COMMITTED として扱われます。いいえ

分離レベルは、トランザクション内で最初のクエリまたはデータ変更ステートメント(SELECTINSERTDELETEUPDATEMERGEFETCH、または COPY)が実行された後には変更できません。

アクセスモード

アクセスモードは、トランザクションが読み取り/書き込み可能か、または読み取り専用かを決定します。デフォルトは READ WRITE です。

トランザクションが READ ONLY の場合、一時テーブル以外のテーブルに書き込む可能性がある以下のコマンドは許可されません。

  • INSERTUPDATEDELETEMERGECOPY FROM

以下のコマンドは、条件付きではなく無条件に禁止されます。

  • すべての CREATEALTER、および DROP コマンド

  • COMMENTGRANTREVOKETRUNCATE

  • EXPLAIN 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_isolationdefault_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';