プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
12cリリース1 (12.1)
B71278-13
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

SET TRANSACTION

用途

SET TRANSACTION文を使用すると、現行のトランザクションを読取り専用または読み書き両用として設定したり、分離レベルを設定したり、指定したロールバック・セグメントにトランザクションを割り当てたり、名前をトランザクションに割り当てることができます。

TXロックを取得する操作によって、トランザクションが暗黙的に開始されます。

  • データを変更する文が発行されたとき

  • SELECT ... FOR UPDATE文が発行されたとき

  • SET TRANSACTION文またはDBMS_TRANSACTIONパッケージによってトランザクションが明示的に開始されたとき

COMMIT文またはROLLBACK文を発行すると、現行のトランザクションが明示的に終了されます。

SET TRANSACTION文によって実行される操作の影響が及ぶのは、現行トランザクションのみであり、他のユーザーや他のトランザクションには影響しません。トランザクションは、COMMIT文またはROLLBACK文が発行されると終了します。Oracle Databaseは、データ定義言語(DDL)文の実行前と後に、現行トランザクションを暗黙的にコミットします。


関連項目:

「COMMIT」および「ROLLBACK」を参照してください。

前提条件

SET TRANSACTION文を使用する場合、トランザクションの先頭に記述する必要があります。ただし、SET TRANSACTION文が必要ないトランザクションもあります。

構文

set_transaction::=

set_transaction.gifの説明が続きます。
図set_transaction.gifの説明

セマンティクス

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句

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文は、実際にはデータベースに対する変更を永続化するものではありません。これは単に、この読取り専用トランザクションを終了するためのものです。