SET TRANSACTION文を使用すると、読取り専用トランザクションを開始できます。読取り専用トランザクションでは反復可能読取りが行えるため、他のユーザーが更新中の1つ以上の表に対して、複数の問合せを実行する場合に便利です。次にSET TRANSACTION文の例を示します。
EXEC SQL SET TRANSACTION READ ONLY;
SET TRANSACTION文は、読取り専用トランザクションの最初のSQL文である必要があり、1つのトランザクションで1回しか使用できません。READ ONLYパラメータは必須です。これを使用しても、他のトランザクションには影響がありません。
読取り専用トランザクションに使用できるのは、SELECT文、COMMIT文およびROLLBACK文のみです。たとえば、INSERT文、DELETE文またはSELECT FOR UPDATE OF文を使用するとエラーが発生します。
読取り専用トランザクション中、複数の表と複数の問合せで構成された読取り一貫性ビューが作成され、すべての問合せがデータベースの同じスナップショットを参照します。他のユーザーは、通常の方法でデータの問合せや更新ができます。
読取り専用トランザクションは、COMMIT文またはROLLBACK文、データ定義文によって終了します。(データ定義文では暗黙的COMMITが発行されることを思い出してください。)
次の例では、店の管理者が読取り専用トランザクションを使用して、当日、先週および先月の売上を調べ、要約レポートを生成しています。このレポートは、このトランザクションの実行中にデータベースを更新する他のユーザーによる影響を受けません。
EXEC SQL SET TRANSACTION READ ONLY; EXEC SQL SELECT sum(saleamt) INTO :daily FROM sales WHERE saledate = SYSDATE; EXEC SQL SELECT sum(saleamt) INTO :weekly FROM sales WHERE saledate > SYSDATE - 7; EXEC SQL SELECT sum(saleamt) INTO :monthly FROM sales WHERE saledate > SYSDATE - 30; EXEC SQL COMMIT WORK; /* simply ends the transaction since there are no changes to make permanent */ /* format and print report */