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により個々のトランザクションのデフォルト特性を上書きすることができます。
利用可能なトランザクション特性はトランザクションの隔離レベルとトランザクションのアクセスモード(読み書きモードもしくは読み取りのみモード)です。
トランザクションの隔離レベルは、並行して実行中の他のトランザクションが存在する場合、そのトランザクションが見ることができるデータを決定するものです。
1つひとつの文から見ることができるのは、その文が開始される前にコミットされた行のみです。 これがデフォルトです。
現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。
標準SQLでは、さらにREAD UNCOMMITTEDとREPEATABLE READという2つのレベルを定義しています。 PostgreSQLではREAD UNCOMMITTEDはREAD COMMITTEDとして、REPEATABLE READはSERIALIZABLEとして扱われます。
トランザクション隔離レベルは、そのトランザクションにおける最初の問い合わせ文やデータ更新文(SELECT、INSERT、DELETE、UPDATE、FETCH、COPY)が実行された後からは変更することができません。 トランザクションの隔離や同時実行制御についての詳細情報は第13章を参照してください。
トランザクションのアクセスモードは、そのトランザクションが読み書き可能か読み取りのみかを決定します。 デフォルトは読み書き可能です。 読み取りのみのトランザクションでは、書き込み対象のテーブルが一時テーブルでない限り、INSERT、UPDATE、DELETE、COPY FROMなどの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などで設定可能です。 詳細は第18章を参照してください。
どちらのコマンドも標準SQLで定義されています。 標準SQLではデフォルトのトランザクションはSERIALIZABLEです。 PostgreSQLでは、通常、READ COMMITTEDがデフォルトですが、これは上述の通り変更可能です。 述部ロックが存在しないため、SERIALIZABLEは完璧なシリアライザブルではありません。 詳細は第13章を参照してください。
標準SQLでは、もう1つ、診断領域の大きさというトランザクション特性があり、このコマンドで設定可能です。 この概念は組み込みSQL固有のものなので、PostgreSQLサーバには実装されていません。
標準SQLでは、連続するtransaction_modesの間にはカンマが必要です。 歴史的な理由よりPostgreSQLではカンマを省略することができます。