SET TRANSACTION
目的
SET
TRANSACTION
文を使用すると、現行のトランザクションを読取り専用または読み書き両用として設定したり、分離レベルを設定したり、指定したロールバック・セグメントにトランザクションを割り当てたり、名前をトランザクションに割り当てることができます。
TXロックを取得する操作によって、トランザクションが暗黙的に開始されます。
-
データを変更する文が発行されたとき
-
SELECT
...FOR
UPDATE
文が発行されたとき -
SET
TRANSACTION
文またはDBMS_TRANSACTION
パッケージによってトランザクションが明示的に開始されたとき
COMMIT
文またはROLLBACK
文を発行すると、現行のトランザクションが明示的に終了されます。
SET
TRANSACTION
文によって実行される操作の影響が及ぶのは、現行トランザクションのみであり、他のユーザーや他のトランザクションには影響しません。トランザクションは、COMMIT
文またはROLLBACK
文が発行されると終了します。Oracle Databaseは、データ定義言語(DDL)文の実行前と後に、現行トランザクションを暗黙的にコミットします。
前提条件
SET
TRANSACTION
文を使用する場合、トランザクションの先頭に記述する必要があります。ただし、SET
TRANSACTION
文が必要ないトランザクションもあります。
構文
set_transaction::=
セマンティクス
READ ONLY
READ
ONLY
句を使用すると、現行のトランザクションを読取り専用に設定できます。この句では、トランザクション・レベルの読取り一貫性を設定します。
そのトランザクションの後続のすべての問合せでは、トランザクションの開始前にコミットされた変更のみが参照されます。読取り専用トランザクションは、他のユーザーが更新中の1つ以上の表に対して、複数の問合せを実行するレポートに役立ちます。
ユーザーSYS
は、この句を使用できません。SYS
による問合せでは、SYS
がトランザクションをREAD
ONLY
に設定した場合でも、トランザクション中の変更が戻されます。
読取り専用トランザクションの制限事項
読取り専用トランザクションで許可される文は、次の文に限定されます。
-
副問合せ(
for_update_clause
を指定しないSELECT
文) -
LOCK
TABLE
-
SET
ROLE
-
ALTER
SESSION
-
ALTER
SYSTEM
READ WRITE
READ
WRITE
を指定すると、現行のトランザクションは読み書き両用トランザクションに設定されます。この句によって、文レベルの読取り一貫性が設定されます(これがデフォルトです)。
読み書き両用トランザクションの制限事項
同じトランザクションで、トランザクション・レベルと文レベルの読取り一貫性を切り替えることはできません。
ISOLATION LEVEL句
-
SQL規格に定義されているシリアライズ可能トランザクション分離モードを設定する場合に、
SERIALIZABLE
を指定します。シリアライズ可能トランザクションにデータ操作言語(DML)が含まれている場合、そのDMLがシリアライズ可能トランザクションの開始時にコミットされなかったトランザクション内の更新済のリソースを更新しようとすると、そのDML文は正常に実行されません。 -
Oracle Databaseのトランザクションでは、デフォルトで
READ
COMMITTED
が設定されています。別のトランザクションで行ロックを保持しておく必要があるDMLがトランザクションに指定されていると、DML文は行ロックが解除されるまで待ち状態になります。
USE ROLLBACK SEGMENT句
ノート:
この句は、UNDO用のロールバック・セグメントを使用している場合にのみ有効です。自動UNDO管理モードでUNDO領域を管理することをお薦めします。データベースを自動UNDOモードで実行すると、この句は無視されます。
USE ROLLBACK SEGMENT
を指定すると、現行のトランザクションを、指定したロールバック・セグメントに割り当てることができます。この句によって、現行のトランザクションは暗黙的に読み書き両用トランザクションに設定されます。
パラレルDMLでは、複数のロールバック・セグメントが必要です。したがって、トランザクションにパラレルDML操作が含まれている場合、この句は無視されます。
NAME句
NAME
句を使用すると、現行のトランザクションに名前を割り当てることができます。この句は、分散データベース環境でインダウト・トランザクションを識別および変換する場合に便利です。string
値の最大長は255バイトです。
分散トランザクションに対して名前を指定する場合、トランザクションのコミット時に、名前はコミットのコメントとなり、COMMIT
文で明示的に指定した任意のコメントを上書きします。
関連項目:
トランザクションの名前指定の詳細は、『Oracle Database概要』を参照してください。
例
トランザクションの設定: 例
次の文は、サンプルの注文入力(oe
)スキーマのトロントの倉庫にある在庫の製品と量を計算するもので、毎月の最終日の真夜中に実行されます。このレポートは、別の倉庫の在庫を追加および削除する他のユーザーの影響は受けません。
COMMIT; SET TRANSACTION READ ONLY NAME 'Toronto'; SELECT product_id, quantity_on_hand FROM inventories WHERE warehouse_id = 5 ORDER BY product_id; COMMIT;
最初のCOMMIT
文によって、SET
TRANSACTION
が確実にトランザクション内の最初の文となります。最後のCOMMIT
文は、実際にはデータベースに対する変更を永続化するものではありません。これは単に、この読取り専用トランザクションを終了するためのものです。