.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "SET TRANSACTION" "" "2007-05-04" "SQL - 言語" "SQLコマンド"
.SH NAME
SET TRANSACTION \- 現在のトランザクションの特性を設定する

.SH SYNOPSIS
.sp
.nf
SET TRANSACTION \fItransaction_mode\fR [, ...]
SET SESSION CHARACTERISTICS AS TRANSACTION \fItransaction_mode\fR [, ...]

ここで\fItransaction_mode\fRは以下のいずれかです。

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
.sp
.fi
.SH "説明"
.PP
\fBSET TRANSACTION\fRは現在のトランザクションの特性を設定します。
これはその後のトランザクションには影響を及ぼしません。
\fBSET SESSION CHARACTERISTICS\fRは、セッションにおけるそれ以後のトランザクションのデフォルトのトランザクション特性を設定します。
\fBSET TRANSACTION\fRにより個々のトランザクションのデフォルト特性を上書きすることができます。
.PP
利用可能なトランザクション特性はトランザクションの隔離レベルとトランザクションのアクセスモード（読み書きモードもしくは読み取りのみモード）です。
.PP
トランザクションの隔離レベルは、並行して実行中の他のトランザクションが存在する場合、そのトランザクションが見ることができるデータを決定するものです。
.TP
\fBREAD COMMITTED\fR
1つひとつの文から見ることができるのは、その文が開始される前にコミットされた行のみです。
これがデフォルトです。
.TP
\fBSERIALIZABLE\fR
現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。
.PP
標準SQLでは、さらにREAD UNCOMMITTEDとREPEATABLE READという2つのレベルを定義しています。
PostgreSQLではREAD UNCOMMITTEDはREAD COMMITTEDとして、REPEATABLE READはSERIALIZABLEとして扱われます。
.PP
トランザクション隔離レベルは、そのトランザクションにおける最初の問い合わせ文やデータ更新文（\fBSELECT\fR、\fBINSERT\fR、\fBDELETE\fR、\fBUPDATE\fR、\fBFETCH\fR、\fBCOPY\fR）が実行された後からは変更することができません。
トランザクションの隔離や同時実行制御についての詳細情報はin the documentationを参照してください。
.PP
トランザクションのアクセスモードは、そのトランザクションが読み書き可能か読み取りのみかを決定します。
デフォルトは読み書き可能です。
読み取りのみのトランザクションでは、書き込み対象のテーブルが一時テーブルでない限り、INSERT、UPDATE、DELETE、COPY FROMなどのSQLコマンドを実行できません。
また、CREATE、ALTER、DROP系の全てのSQLコマンド、COMMENT、GRANT、REVOKE、TRUNCATEは、まったく実行できません。
さらに、EXPLAIN ANALYZEとEXECUTEコマンドに上述のコマンドの実行が含まれている場合、これらのコマンドも実行できません。
この方法ではディスクへの書き込み防止をまったく行わないので、読み取り専用を高レベルで実現する考え方と言えます。
.SH "注釈"
.PP
\fBSET TRANSACTION\fRを\fBSTART TRANSACTION\fRや\fBBEGIN\fRの前に実行した場合、そのトランザクションは即座に終了するので、効果はまったく現れません。
.PP
\fBBEGIN\fRあるいは\fBSTART TRANSACTION\fRで目的の\fItransaction_modes\fRを指定すれば、\fBSET TRANSACTION\fRは不要です。
.PP
セッションのデフォルトのトランザクションモードは、設定パラメータdefault_transaction_isolationとdefault_transaction_read_onlyで設定することができます
（実際、\fBSET SESSION CHARACTERISTICS\fRは冗長な記述であり、これらの変数を\fBSET\fRで設定するのと変わりありません）。
したがって、トランザクションモードのデフォルトは設定ファイルや\fBALTER DATABASE\fRなどで設定可能です。
詳細はin the documentationを参照してください。
.SH "互換性"
.PP
どちらのコマンドも標準SQLで定義されています。
標準SQLではデフォルトのトランザクションはSERIALIZABLEです。
PostgreSQLでは、通常、READ COMMITTEDがデフォルトですが、これは上述の通り変更可能です。
述部ロックが存在しないため、SERIALIZABLEは完璧なシリアライザブルではありません。
詳細はin the documentationを参照してください。
.PP
標準SQLでは、もう1つ、診断領域の大きさというトランザクション特性があり、このコマンドで設定可能です。
この概念は組み込みSQL固有のものなので、PostgreSQLサーバには実装されていません。
.PP
標準SQLでは、連続する\fItransaction_modes\fRの間にはカンマが必要です。
歴史的な理由よりPostgreSQLではカンマを省略することができます。
