SET TRANSACTION transaction_mode [, ...] SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...] ここでtransaction_modeは以下のいずれかです。 ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED } READ WRITE | READ ONLY
SET TRANSACTIONは現在のトランザクションの特性を設定します。 これはその後のトランザクションには影響をおよぼしません。 SET SESSION CHARACTERISTICSは、セッションにおける後続全てのトランザクションのデフォルトのトランザクション特性を設定します。 SET TRANSACTIONにより個々のトランザクションのデフォルト特性を上書きすることができます。
利用可能なトランザクション特性はトランザクションの隔離レベルとトランザクションのアクセスモード(読み書きモードもしくは読み取りのみモード)です。
以下に示すトランザクションの隔離レベルは、他のトランザクションが並行して実行している時に、そのトランザクションからどのようなデータを見ることができるかを決定するものです。
一つの文はそれが開始される前にコミットされた行のみ見ることができます。 これがデフォルトです。
現在のトランザクションにおける全ての文は、このトランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。
標準SQLでは、READ UNCOMMITTEDとREPEATABLE READという、更に2つのレベルを定義しています。 PostgreSQLではREAD UNCOMMITTEDはREAD COMMITTEDとして扱われ、REPEATABLE READはSERIALIZABLEとして扱われます。
トランザクション隔離レベルは、そのトランザクションにおける最初の問い合わせやデータを変更する文(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 TRANSACTIONをSTART TRANSACTIONやBEGINの前に実行した場合、そのトランザクションは即座に終了しますので、効果は全く現れません。
代わりにBEGINあるいはSTART TRANSACTIONで目的のtransaction_modesを指定することで、SET TRANSACTIONを省くことができます。
セッションのデフォルトのトランザクションモードは、設定パラメータdefault_transaction_isolationとdefault_transaction_read_onlyで設定することができます。 (実際、SET SESSION CHARACTERISTICSはただの冗長なものであり、SETでこれらの変数を設定することと等価です。) これは、このデフォルトは設定ファイルやALTER DATABASEなどで設定可能であることを意味しています。 詳細は項16.4を参照してください。
どちらのコマンドも標準SQLで定義されています。 標準SQLではデフォルトのトランザクションはSERIALIZABLEです。 PostgreSQLでは READ COMMITTEDが通常のデフォルトですが、これは上述の通り変更可能です。 述部ロックが存在しないため、SERIALIZABLEは完璧なシリアライザブルではありません。 詳細は第12章を参照してください。
標準SQLでは、もう一つ、診断領域の大きさという、トランザクション特性があり、このコマンドで設定可能です。 この概念は組み込みSQL固有のものですので、PostgreSQLサーバには実装されていません。
標準SQLでは、連続するtransaction_modesの間にはコンマが必要です。 歴史的な理由よりPostgreSQLではコンマを省略することができます。