説明
SET TRANSACTIONコマンドは、現在のトランザクションの特性を設定します。 その後のトランザクションには影響しません。SET SESSION CHATERISTICSは、セッションの後続のトランザクションのデフォルトトランザクション特性を設定します。 これらのデフォルトは、個々のトランザクションに対してSET TRANSACTIONでオーバーライドできます。
利用可能なトランザクション特性は、トランザクション分離レベル、トランザクションアクセスモード (読み取り /書き込みまたは読み取り専用) 、および延期可能モードである。 さらに、スナップショットを選択できますが、セッションのデフォルトとしてではなく、現在のトランザクションに対してのみ選択できます。
トランザクションの分離レベルによって、他のトランザクションが同時に実行されているときにトランザクションが表示できるデータが決まります。
READ COMMITTED: ステートメントは、開始前にコミットされた行のみを表示できます。 この値がデフォルトです。REPEATABLE READ: 現在のトランザクションのすべてのステートメントは、このトランザクションで最初のクエリまたはデータ変更ステートメントが実行される前にコミットされた行のみを表示できます。SERIALIZABLE: 現在のトランザクションのすべてのステートメントは、このトランザクションで最初のクエリまたはデータ変更ステートメントが実行される前にコミットされた行のみを表示できます。 同時シリアル化可能なトランザクション間の読み取りと書き込みのパターンが、それらのトランザクションのシリアル (一度に1つ) の実行では発生しなかった状況を作成する場合、そのうちの1つはシリアル化_失敗エラーでロールバックされます。
SQL標準は、READ UNCOMMITTEDという1つの追加レベルを定義します。 InPostgreSQL READ UNCOMMITTEDはREAD COMMITTEDとして扱われます。
トランザクションの最初のクエリまたはデータ変更ステートメント (SELECT、INSERT、DELETE、UPDATE、MERGE、FETCH、COPY) が実行された後は、トランザクションの分離レベルを変更できません。
トランザクションアクセスモードは、トランザクションが読み取り/書き込み、または読み取り専用かを判断します。 読み取り /書き込みがデフォルトです。 トランザクションが読み取り専用の場合、次のSQLコマンドは許可されません。インサート,更新,削除,マージ、およびからのコピー彼らが書き込むテーブルが一時的なテーブルではない場合、すべて作成,ALTER、およびドロップコマンド;コメント,グラント,REVOKE,トランケート; と分析の説明と実行実行するコマンドがリストされているものの中にある場合は これは、ディスクへのすべての書き込みを妨げるわけではない、読み取り専用の高レベルの概念です。
トランザクションがSERIALIZABLEおよびREAD ONLYでない限り、DEFERRABLEトランザクションプロパティは有効ではありません。 これらのプロパティの3つすべてがトランザクションに対して選択されると、トランザクションは、そのスナップショットを最初に取得するときにブロックすることができ、その後、SERIALIZABLEトランザクションの通常のオーバーヘッドなしで、シリアル化の失敗に寄与したり、シリアル化の失敗によってキャンセルされたりするリスクなしに実行できます。 このモードは、長時間のレポートやバックアップに適しています。
SET TRANSACTION SNAPSHOTコマンドを使用すると、新しいトランザクションを既存のトランザクションと同じスナップショットで実行できます。 既存のトランザクションは、pg_export_snapshot関数を使用してスナップショットをエクスポートしている必要があります。 この関数はスナップショット識別子を返します。これは、インポートするスナップショットを指定するためにSET TRANSACTION snapshotに指定する必要があります。 このコマンドでは、識別子は文字列リテラルとして記述する必要があります (例: '00000003-0000001B-1 ') 。SET TRANSACTION SNAPSHOTは、トランザクションの最初のクエリまたはデータ変更ステートメント (SELECT、INSERT、DELETE、UPDATE、MERGE、FETCH、またはCOPY) の前にのみ実行できます。 さらに、トランザクションはすでにSERIALIZABLEまたはREPEATABLE READ分離レベルに設定されている必要があります (そうでない場合、READ COMMITTEDモードはコマンドごとに新しいスナップショットを取得するため、スナップショットはすぐに破棄されます) 。 インポートするトランザクションがSERIALIZABLE分離レベルを使用する場合、スナップショットをエクスポートしたトランザクションもその分離レベルを使用する必要があります。 また、読み取り専用ではないシリアル化可能なトランザクションは、読み取り専用トランザクションからスナップショットをインポートできません。
概要
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTIONスナップショットsnapshot_id
セッション特性をTRANSACTION transaction_modeとして設定する [, ...]
transaction_modeは次のとおりです。
隔離レベル {SERIALIZABLE | 繰り返し読み取り | READ COMMITTED | READ UNCOMMITTED}
READ WRITE | READ ONLY
[ではない] 親愛なる 注
SET TRANSACTIONが事前のSTART TRANSACTIONまたはBEGINなしで実行された場合、警告が表示されます。代わりに、
BEGINまたはSTART TRANSACTIONで所望のtransaction_modeを指定することによって、SET transactionを省略することが可能である。 ただし、このオプションはSET TRANSACTION SNAPSHOTでは使用できません。セッションデフォルトトランザクションモードは、設定パラメータdefault_transaction_isolation、default_transaction_read_only、およびdefault_transaction_deferrableを介して設定または検査することもできます。 (実際、
SETセッション特性は、これらの変数をSETで設定するのと非常に同等です。) これは、ALTER DATABASEなどを介して、設定ファイルでデフォルトを設定できることを意味します。
例
既存のトランザクションと同じスナップショットで新しいトランザクションを開始するには、最初に既存のトランザクションからスナップショットをエクスポートします。 これにより、スナップショット識別子が返されます。
トランザクション隔離レベルの繰り返し読み取りを開始します。
SELECT pg_export_snapshot();
pg_export_snapshot
---------------------
00000003-0000001B-1
(1行) 次に、新しく開いたトランザクションの開始時に、SET TRANSACTION snapshotコマンドでスナップショット識別子を指定します。
トランザクション隔離レベルの繰り返し読み取りを開始します。
セットトランザクションスナップショット '00000003-0000001B-1 ';