SET TRANSACTION <refpurpose>set the characteristics of the current transaction</refpurpose> — 現在のトランザクションの特性を設定する
SET TRANSACTIONtransaction_mode
[, ...] SET TRANSACTION SNAPSHOTsnapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTIONtransaction_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
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 UNCOMMITTED
はREAD 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.
トランザクション分離レベルは、そのトランザクションにおける最初の問い合わせ文やデータ更新文(SELECT
、INSERT
、DELETE
、UPDATE
、MERGE
、FETCH
、COPY
)が実行された後では変更できません。
トランザクションの分離や同時実行制御についての詳細情報は第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コマンドの実行が制限されます。
書き込み対象のテーブルが一時テーブルでない場合、INSERT
、UPDATE
、DELETE
、MERGE
、COPY FROM
などのSQLコマンドを実行できません。
すべてのCREATE
、ALTER
、DROP
系のSQLコマンド、COMMENT
、GRANT
、REVOKE
、TRUNCATE
は、実行できません。
さらに、上述のコマンドが含まれるEXPLAIN ANALYZE
とEXECUTE
コマンドも実行できません。
これは読み取り専用の高レベルの概念であり、ディスクへの書き込みをすべて防ぐわけではありません。
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
はトランザクションの開始時、つまり、トランザクションの最初の問い合わせまたはデータ変更文(SELECT
、INSERT
、DELETE
、UPDATE
、MERGE
、FETCH
、COPY
)の前でのみ実行できます。
さらに、そのトランザクションを前もってSERIALIZABLE
またはREPEATABLE READ
分離レベルに設定していなければなりません。
(さもないと、READ COMMITTED
ではコマンドそれぞれに対して新しいスナップショットを取りますので、このスナップショットは即座に破棄されます。)
取り込むトランザクションがSERIALIZABLE
分離レベルを使用している場合、スナップショットを公開したトランザクションもこの分離レベルを使用しなければなりません。
また、読み取り専用ではないシリアライザブルトランザクションは、読み取り専用トランザクションから公開されたスナップショットを取り込むことができません。
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 TRANSACTION
やBEGIN
を発行することなく実行した場合、警告が発生しますが、それ以外は何の効果もありません。
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_isolation、default_transaction_read_only、default_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_isolation、transaction_read_only、transaction_deferrableで設定したり確認したりすることができます。
このパラメータの1つを設定することは、可能ならば同じ制限の下で対応するSET TRANSACTION
オプションと同じように動作します。
しかしながら、設定ファイル内や動作中のSQL以外のところからは、これらのパラメータを設定できません。
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';
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ではカンマを省略することができます。