無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

SET TRANSACTION

名前

SET TRANSACTION -- 現在のトランザクションの特性を設定する

概要

SET TRANSACTION 

transaction_mode

 [, ...]
SET TRANSACTION SNAPSHOT 

snapshot_id


SET SESSION CHARACTERISTICS AS TRANSACTION 

transaction_mode

 [, ...]



ここで

transaction_mode

は以下のいずれかです。



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

説明

SET TRANSACTION は現在のトランザクションの特性を設定します。 これはその後のトランザクションには影響を及ぼしません。 SET SESSION CHARACTERISTICS は、セッションにおけるそれ以後のトランザクションのデフォルトのトランザクション特性を設定します。 SET TRANSACTION により個々のトランザクションのデフォルト特性を上書きすることができます。

利用可能なトランザクション特性はトランザクションの隔離レベル、トランザクションのアクセスモード(読み書きモードもしくは読み取りのみモード)、遅延モードです。 さらに、セッションのデフォルトとしてではなく、現在のトランザクションのみに対してスナップショットを選択することができます。

トランザクションの隔離レベルは、並行して実行中の他のトランザクションが存在する場合、そのトランザクションが見ることができるデータを決定するものです。

READ COMMITTED

1つひとつの文から見ることができるのは、その文が開始される前にコミットされた行のみです。 これがデフォルトです。

REPEATABLE READ

現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。

SERIALIZABLE

現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。 同時実行のシリアライザブルトランザクションの中で読み取りと書き込みのパターンによって、これらのトランザクションの実行を直列に(同時に一度)行うことができない状況になる場合、その内1つのトランザクションは serialization_failure というエラーでロールバックされます。

標準SQLでは、さらに READ UNCOMMITTED という1つのレベルを定義しています。 PostgreSQL では READ UNCOMMITTED READ COMMITTED として扱われます。

トランザクション隔離レベルは、そのトランザクションにおける最初の問い合わせ文やデータ更新文( SELECT INSERT DELETE UPDATE FETCH COPY )が実行された後からは変更することができません。 トランザクションの隔離や同時実行制御についての詳細情報は 第13章 を参照してください。

トランザクションのアクセスモードは、そのトランザクションが読み書き可能か読み取りのみかを決定します。 デフォルトは読み書き可能です。 読み取りのみのトランザクションでは、書き込み対象のテーブルが一時テーブルでない限り、 INSERT UPDATE DELETE COPY FROM などのSQLコマンドを実行できません。 また、 CREATE ALTER DROP 系の全てのSQLコマンド、 COMMENT GRANT REVOKE TRUNCATE は、まったく実行できません。 さらに、 EXPLAIN ANALYZE EXECUTE コマンドに上述のコマンドの実行が含まれている場合、これらのコマンドも実行できません。 この方法ではディスクへの書き込み防止をまったく行わないので、読み取り専用を高レベルで実現する考え方と言えます。

DEFERRABLE トランザクション属性は、トランザクションが SERIALIZABLE かつ READ ONLY である場合のみ効果があります。 あるトランザクションでこれら3つの属性がすべて選択されている場合、最初にスナップショットを獲得する時にブロックされる可能性があります。 その後、そのトランザクションを SERIALIZABLE トランザクションの通常のオーバーヘッドを伴わず、またシリアライズ処理の失敗を引き起こす恐れやシリアライズ処理の失敗によりキャンセルされる恐れもなく実行することができます。 これは時間がかかるレポート処理やバックアップによく適しています。

SET TRANSACTION SNAPSHOT コマンドにより、 既存のトランザクションと同じ スナップショット を持つ新しいトランザクションを実行することができます。 既存のトランザクションは pg_export_snapshot 関数( 項9.26.5 参照)を使用してそのスナップショットを公開していなければなりません。 この関数はスナップショット識別子を返します。 この識別子を、どのスナップショットを取り込むかを指定するために SET TRANSACTION SNAPSHOT に渡さなければなりません。 このコマンドでは、この識別子を例えば '000003A1-1' のようにリテラル文字列として記述しなければなりません。 トランザクションの開始時に、トランザクションの最初の問い合わせまたはデータ変更文( SELECT INSERT DELETE UPDATE FETCH COPY )を行う前でのみ、 SET TRANSACTION SNAPSHOT を実行することができます。 さらに、そのトランザクションを前もって SERIALIZABLE または REPEATABLE READ 隔離レベルに設定していなければなりません。 (さもないと、 READ COMMITTED ではコマンドそれぞれに対して新しいスナップショットを取りますので、このスナップショットは即座に破棄されます。) 取り込むトランザクションが SERIALIZABLE 隔離レベルを使用している場合、スナップショットを公開したトランザクションもこの隔離レベルを使用しなければなりません。 また、読み取り専用ではないシリアライザブルトランザクションは、読み取り専用トランザクションから公開されたスナップショットを取り込むことができません。

注釈

SET TRANSACTION START TRANSACTION BEGIN の前に実行した場合、そのトランザクションは即座に終了するので、効果はまったく現れません。

BEGIN あるいは START TRANSACTION で目的の transaction_modes を指定すれば、 SET TRANSACTION は不要です。 しかし SET TRANSACTION SNAPSHOT ではこの選択を行うことができません。

セッションのデフォルトのトランザクションモードは、設定パラメータ default_transaction_isolation default_transaction_read_only default_transaction_deferrable で設定することができます (実際、 SET SESSION CHARACTERISTICS は冗長な記述であり、これらの変数を SET で設定するのと変わりありません)。 したがって、トランザクションモードのデフォルトは設定ファイルや ALTER DATABASE などで設定可能です。 詳細は 第18章 を参照してください。

既存のトランザクションと同じスナップショットを持つトランザクションを新しく開始するためには、まず既存のトランザクションからスナップショットを公開します。 以下の例に示すように、これはスナップショット識別子を返します。

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
--------------------
 000003A1-1
(1 row)

そして、新規に開始したトランザクションの先頭の SET TRANSACTION SNAPSHOT でこのスナップショット識別子を渡します。

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '000003A1-1';

互換性

このコマンドは標準 SQL で定義されています。 DEFERRABLE トランザクションモードと SET TRANSACTION SNAPSHOT 構文は例外であり、 PostgreSQL の拡張です。

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

標準SQLでは、もう1つ、診断領域の大きさというトランザクション特性があり、このコマンドで設定可能です。 この概念は組み込みSQL固有のものなので、 PostgreSQL サーバには実装されていません。

標準SQLでは、連続する transaction_modes の間にはカンマが必要です。 歴史的な理由より PostgreSQL ではカンマを省略することができます。


powered by SEO.CUG.NET