SET TRANSACTION [ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ ONLY ] SET SESSION CHARACTERISTICS AS TRANSACTION [ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ ONLY ]
SET TRANSACTION は現在のトランザクションの特性を設定します。 これはその後のトランザクションには影響をおよぼしません。 SET SESSION CHARACTERISTICS はセッションにおける各トランザクションのデフォルトのトランザクション特性を設定します。 SET TRANSACTIONにより個々のトランザクションの特性を上書きすることができます。
利用可能なトランザクション特性はトランザクションの隔離レベルとトランザクションのアクセスモード(読み書きモードもしくは読み取りのみモード)です。
トランザクションの隔離レベルは、他のトランザクションが並行して実行している時に、そのトランザクションからどのようなデータを見ることができるかを決定するものです。
一つの文はそれが開始される前にコミットされた行のみ見ることができます。 これがデフォルトです。
現在のトランザクションはこのトランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。
ティップ: 直感的に言うと、シリアライザブルでは、二つの同時に実行されたトランザクションが作り出したデータベースの状態が、あたかもそれぞれが順に実行した場合と同じになるようになります。
トランザクション隔離レベルは、そのトランザクションにおける最初の問い合わせやデータを変更する文 (SELECT, INSERT, DELETE, UPDATE, FETCH, COPY) が実行された後に設定することはできません。 トランザクションの隔離や同時実行制御についての詳細情報は 第12章 を参照してください。
トランザクションのアクセスモードは、そのトランザクションが読み書き可能か読み取りのみかを決定します。 デフォルトは読み書き可能です。 読み取りのみのトランザクションでは、書き込み対象のテーブルが一時テーブルでない限り、INSERT、UPDATE、DELETE、および COPY TOというSQLコマンドを実行できません。 また、CREATE、ALTER、DROP系のすべてのSQLコマンド、および、COMMENT、GRANT、REVOKE、TRUNCATEは、読み取りのみのトランザクションでは全く実行できません。 更に、EXPLAIN ANALYZEとEXECUTEは、そのコマンドが上述のコマンドを実行するものであれば、実行できません。 これは、ディスクへの書き込み防止を行わない、高度な読み取りのみの表現方法です。
以下のコマンドや設定ファイルでセッションのデフォルトのトランザクション隔離レベルを設定することができます。
SET default_transaction_isolation = 'value'
より詳細は項16.4を参照してください。
どちらのコマンドも標準SQLで定義されています。 標準SQL ではデフォルトのトランザクションは SERIALIZABLE ですが、PostgreSQLでは READ COMMITED が通常のデフォルトです。 しかし、これは上述の通り変更可能です。 PostgreSQL ではREAD UNCOMMITTEDと REPEATABLE READという隔離レベルを提供していません。 多版型同時実行制御のため、SERIALIZABLE は完璧なシリアライザブルではありません。 詳細は第12章を参照してください。
標準SQLでは、もう一つ、診断領域の大きさという、トランザクション特性があり、このコマンドで設定可能です。 この概念は組み込みSQLでの使用のみのためのものです。