バージョンごとのドキュメント一覧

SET TRANSACTION

SET TRANSACTION <refpurpose>set the characteristics of the current transaction</refpurpose> — 現在のトランザクションの特性を設定する

概要

SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]


<phrase>where <replaceable class="parameter">transaction_mode</replaceable> is one of:</phrase>

ここでtransaction_modeは以下のいずれかです。

    ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
    READ WRITE | READ ONLY
    [ NOT ] DEFERRABLE

説明

<title>Description</title>

The <command>SET TRANSACTION</command> command sets the characteristics of the current transaction. It has no effect on any subsequent transactions. <command>SET SESSION CHARACTERISTICS</command> sets the default transaction characteristics for subsequent transactions of a session. These defaults can be overridden by <command>SET TRANSACTION</command> for an individual transaction. SET TRANSACTIONは現在のトランザクションの特性を設定します。 これはそれより後のトランザクションには影響を及ぼしません。 SET SESSION CHARACTERISTICSは、セッションにおけるそれ以後のトランザクションのデフォルトのトランザクション特性を設定します。 個々のトランザクションについてSET TRANSACTIONによりデフォルト特性を上書きすることができます。

The available transaction characteristics are the transaction isolation level, the transaction access mode (read/write or read-only), and the deferrable mode. In addition, a snapshot can be selected, though only for the current transaction, not as a session default. 利用可能なトランザクション特性はトランザクションの分離レベル、トランザクションのアクセスモード(読み書きモードもしくは読み取り専用モード)、遅延モードです。 さらに、セッションのデフォルトとしてではなく、現在のトランザクションのみに対してスナップショットを選択することができます。

The isolation level of a transaction determines what data the transaction can see when other transactions are running concurrently: トランザクションの分離レベルは、並行して実行中の他のトランザクションが存在する場合、そのトランザクションが見ることができるデータを決定するものです。

READ COMMITTED

A statement can only see rows committed before it began. This is the default. 1つひとつの文から見ることができるのは、その文が開始される前にコミットされた行のみです。 これがデフォルトです。

REPEATABLE READ

All statements of the current transaction can only see rows committed before the first query or data-modification statement was executed in this transaction. 現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。

SERIALIZABLE

All statements of the current transaction can only see rows committed before the first query or data-modification statement was executed in this transaction. If a pattern of reads and writes among concurrent serializable transactions would create a situation which could not have occurred for any serial (one-at-a-time) execution of those transactions, one of them will be rolled back with a <literal>serialization_failure</literal> error. 現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。 同時実行のシリアライザブルトランザクションの中で読み取りと書き込みのパターンによって、これらのトランザクションの実行を直列に(同時に一度)行うことができない状況になる場合、その内1つのトランザクションはserialization_failureというエラーでロールバックされます。

The SQL standard defines one additional level, <literal>READ UNCOMMITTED</literal>. In <productname>PostgreSQL</productname> <literal>READ UNCOMMITTED</literal> is treated as <literal>READ COMMITTED</literal>. 標準SQLでは、READ UNCOMMITTEDというもう1つのレベルを定義しています。 PostgreSQLではREAD UNCOMMITTEDREAD COMMITTEDとして扱われます。

The transaction isolation level cannot be changed after the first query or data-modification statement (<command>SELECT</command>, <command>INSERT</command>, <command>DELETE</command>, <command>UPDATE</command>, <command>MERGE</command>, <command>FETCH</command>, or <command>COPY</command>) of a transaction has been executed. See <xref linkend="mvcc"/> for more information about transaction isolation and concurrency control. トランザクション分離レベルは、そのトランザクションにおける最初の問い合わせ文やデータ更新文(SELECTINSERTDELETEUPDATEMERGEFETCHCOPY)が実行された後では変更できません。 トランザクションの分離や同時実行制御についての詳細情報は第13章を参照してください。

The transaction access mode determines whether the transaction is read/write or read-only. Read/write is the default. When a transaction is read-only, the following SQL commands are disallowed: <command>INSERT</command>, <command>UPDATE</command>, <command>DELETE</command>, <command>MERGE</command>, and <command>COPY FROM</command> if the table they would write to is not a temporary table; all <literal>CREATE</literal>, <literal>ALTER</literal>, and <literal>DROP</literal> commands; <literal>COMMENT</literal>, <literal>GRANT</literal>, <literal>REVOKE</literal>, <literal>TRUNCATE</literal>; and <literal>EXPLAIN ANALYZE</literal> and <literal>EXECUTE</literal> if the command they would execute is among those listed. This is a high-level notion of read-only that does not prevent all writes to disk. トランザクションのアクセスモードは、そのトランザクションが読み書き可能か読み取り専用かを決定します。 デフォルトは読み書き可能です。 読み取り専用のトランザクションでは、以下のSQLコマンドの実行が制限されます。 書き込み対象のテーブルが一時テーブルでない場合、INSERTUPDATEDELETEMERGECOPY FROMなどのSQLコマンドを実行できません。 すべてのCREATEALTERDROP系のSQLコマンド、COMMENTGRANTREVOKETRUNCATEは、実行できません。 さらに、上述のコマンドが含まれるEXPLAIN ANALYZEEXECUTEコマンドも実行できません。 これは読み取り専用の高レベルの概念であり、ディスクへの書き込みをすべて防ぐわけではありません。

The <literal>DEFERRABLE</literal> transaction property has no effect unless the transaction is also <literal>SERIALIZABLE</literal> and <literal>READ ONLY</literal>. When all three of these properties are selected for a transaction, the transaction may block when first acquiring its snapshot, after which it is able to run without the normal overhead of a <literal>SERIALIZABLE</literal> transaction and without any risk of contributing to or being canceled by a serialization failure. This mode is well suited for long-running reports or backups. DEFERRABLEトランザクション属性は、トランザクションがSERIALIZABLEかつREAD ONLYである場合のみ効果があります。 あるトランザクションでこれら3つの属性がすべて選択されている場合、最初にスナップショットを獲得する時にブロックされる可能性があります。 その後、そのトランザクションをSERIALIZABLEトランザクションの通常のオーバーヘッドを伴わず、またシリアライズ処理の失敗を引き起こす恐れやシリアライズ処理の失敗によりキャンセルされる恐れもなく実行することができます。 これは時間がかかるレポート処理やバックアップによく適しています。

The <literal>SET TRANSACTION SNAPSHOT</literal> command allows a new transaction to run with the same <firstterm>snapshot</firstterm> as an existing transaction. The pre-existing transaction must have exported its snapshot with the <literal>pg_export_snapshot</literal> function (see <xref linkend="functions-snapshot-synchronization"/>). That function returns a snapshot identifier, which must be given to <literal>SET TRANSACTION SNAPSHOT</literal> to specify which snapshot is to be imported. The identifier must be written as a string literal in this command, for example <literal>'00000003-0000001B-1'</literal>. <literal>SET TRANSACTION SNAPSHOT</literal> can only be executed at the start of a transaction, before the first query or data-modification statement (<command>SELECT</command>, <command>INSERT</command>, <command>DELETE</command>, <command>UPDATE</command>, <command>MERGE</command>, <command>FETCH</command>, or <command>COPY</command>) of the transaction. Furthermore, the transaction must already be set to <literal>SERIALIZABLE</literal> or <literal>REPEATABLE READ</literal> isolation level (otherwise, the snapshot would be discarded immediately, since <literal>READ COMMITTED</literal> mode takes a new snapshot for each command). If the importing transaction uses <literal>SERIALIZABLE</literal> isolation level, then the transaction that exported the snapshot must also use that isolation level. Also, a non-read-only serializable transaction cannot import a snapshot from a read-only transaction. SET TRANSACTION SNAPSHOTコマンドにより、既存のトランザクションと同じスナップショットを持つ新しいトランザクションを実行することができます。 既存のトランザクションはpg_export_snapshot関数(9.28.5参照)を使用してそのスナップショットを公開していなければなりません。 この関数はスナップショット識別子を返します。 どのスナップショットを取り込むかを指定するために、この識別子をSET TRANSACTION SNAPSHOTに渡さなければなりません。 このコマンドでは、この識別子を例えば'00000003-0000001B-1'のようにリテラル文字列として記述しなければなりません。 SET TRANSACTION SNAPSHOTはトランザクションの開始時、つまり、トランザクションの最初の問い合わせまたはデータ変更文(SELECTINSERTDELETEUPDATEMERGEFETCHCOPY)の前でのみ実行できます。 さらに、そのトランザクションを前もってSERIALIZABLEまたはREPEATABLE READ分離レベルに設定していなければなりません。 (さもないと、READ COMMITTEDではコマンドそれぞれに対して新しいスナップショットを取りますので、このスナップショットは即座に破棄されます。) 取り込むトランザクションがSERIALIZABLE分離レベルを使用している場合、スナップショットを公開したトランザクションもこの分離レベルを使用しなければなりません。 また、読み取り専用ではないシリアライザブルトランザクションは、読み取り専用トランザクションから公開されたスナップショットを取り込むことができません。

注釈

<title>Notes</title>

If <command>SET TRANSACTION</command> is executed without a prior <command>START TRANSACTION</command> or <command>BEGIN</command>, it emits a warning and otherwise has no effect. SET TRANSACTIONを、その前にSTART TRANSACTIONBEGINを発行することなく実行した場合、警告が発生しますが、それ以外は何の効果もありません。

It is possible to dispense with <command>SET TRANSACTION</command> by instead specifying the desired <replaceable class="parameter">transaction_modes</replaceable> in <command>BEGIN</command> or <command>START TRANSACTION</command>. But that option is not available for <command>SET TRANSACTION SNAPSHOT</command>. BEGINあるいはSTART TRANSACTIONで目的のtransaction_modesを指定すれば、SET TRANSACTIONを使わずに済ませることができます。 しかしSET TRANSACTION SNAPSHOTに対応するオプションはありません。

The session default transaction modes can also be set or examined via the configuration parameters <xref linkend="guc-default-transaction-isolation"/>, <xref linkend="guc-default-transaction-read-only"/>, and <xref linkend="guc-default-transaction-deferrable"/>. (In fact <command>SET SESSION CHARACTERISTICS</command> is just a verbose equivalent for setting these variables with <command>SET</command>.) This means the defaults can be set in the configuration file, via <command>ALTER DATABASE</command>, etc. Consult <xref linkend="runtime-config"/> for more information. セッションのデフォルトのトランザクションモードは、設定パラメータdefault_transaction_isolationdefault_transaction_read_onlydefault_transaction_deferrableで設定したり確認したりすることができます。 (実際、SET SESSION CHARACTERISTICSはこれらの変数をSETで設定することと同等の冗長な記述に過ぎません。) したがって、トランザクションモードのデフォルトは設定ファイルやALTER DATABASEなどで設定可能です。 詳細は第19章を参照してください。

The current transaction's modes can similarly be set or examined via the configuration parameters <xref linkend="guc-transaction-isolation"/>, <xref linkend="guc-transaction-read-only"/>, and <xref linkend="guc-transaction-deferrable"/>. Setting one of these parameters acts the same as the corresponding <command>SET TRANSACTION</command> option, with the same restrictions on when it can be done. However, these parameters cannot be set in the configuration file, or from any source other than live SQL. 現在のトランザクションモードは、同様に設定パラメータtransaction_isolationtransaction_read_onlytransaction_deferrableで設定したり確認したりすることができます。 このパラメータの1つを設定することは、可能ならば同じ制限の下で対応するSET TRANSACTIONオプションと同じように動作します。 しかしながら、設定ファイル内や動作中のSQL以外のところからは、これらのパラメータを設定できません。

<title>Examples</title>

To begin a new transaction with the same snapshot as an already existing transaction, first export the snapshot from the existing transaction. That will return the snapshot identifier, for example: 既存のトランザクションと同じスナップショットを持つトランザクションを新しく開始するためには、まず既存のトランザクションからスナップショットを公開します。 以下の例に示すように、これはスナップショット識別子を返します。

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
---------------------
 00000003-0000001B-1
(1 row)

Then give the snapshot identifier in a <command>SET TRANSACTION SNAPSHOT</command> command at the beginning of the newly opened transaction: そして、新規に開始したトランザクションの先頭のSET TRANSACTION SNAPSHOTでこのスナップショット識別子を渡します。

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';

互換性

<title>Compatibility</title>

These commands are defined in the <acronym>SQL</acronym> standard, except for the <literal>DEFERRABLE</literal> transaction mode and the <command>SET TRANSACTION SNAPSHOT</command> form, which are <productname>PostgreSQL</productname> extensions. このコマンドは標準SQLで定義されています。 DEFERRABLEトランザクションモードとSET TRANSACTION SNAPSHOT構文は例外であり、PostgreSQLの拡張です。

<literal>SERIALIZABLE</literal> is the default transaction isolation level in the standard. In <productname>PostgreSQL</productname> the default is ordinarily <literal>READ COMMITTED</literal>, but you can change it as mentioned above. 標準SQLではデフォルトのトランザクション分離レベルはSERIALIZABLEです。 PostgreSQLでは、通常、READ COMMITTEDがデフォルトですが、これは上述の通り変更可能です。

In the SQL standard, there is one other transaction characteristic that can be set with these commands: the size of the diagnostics area. This concept is specific to embedded SQL, and therefore is not implemented in the <productname>PostgreSQL</productname> server. 標準SQLでは、もう1つ、診断領域の大きさというトランザクション特性があり、このコマンドで設定可能です。 この概念は組み込みSQL固有のものなので、PostgreSQLサーバには実装されていません。

The SQL standard requires commas between successive <replaceable class="parameter">transaction_modes</replaceable>, but for historical reasons <productname>PostgreSQL</productname> allows the commas to be omitted. 標準SQLでは、連続するtransaction_modesの間にはカンマが必要です。 歴史的な理由よりPostgreSQLではカンマを省略することができます。