自律型トランザクション (Autonomous Transactions)

自律型トランザクションプラグマ (PRAGMA AUTONOMOUS_TRANSACTION) は、メイントランザクション(以降 MT)とは独立した 自律トランザクション(以降 AT) を宣言するためのものである。
注意:自立型トランザクションという表記は正しくない。

自律型トランザクションのメリット

  • SLECT で呼び出す関数の内部で DML を実行することが可能
    通常 SELECT で呼び出す関数に DML が含まれると
    ORA-14551: 問合せの中でDML操作を実行することはできません。 
    とエラーが発生するが、この関数を自律型トランザクション宣言すると SELECT 内でテーブルデータを更新することができる。
  • MT 処理の中にエラー処理のログや監査のログを永続テーブルに書き込むことなどが可能
    2つのトランザクションは独立しているため MT と AT においてロールバック を行なっても互いのトランザクションに影響がない。

トリガー を自律型トランザクションにするとトリガー内で COMMITROLLBACK を記述することも可能。

(注意)自律型トランザクションは宣言したプロシージャの終了までに内部のトランザクションを完了させる必要がある。
さもないと自律トランザクションはロールバックされ、呼び出し元に以下の例外が通知される。

ORA-06519: アクティブな自律型トランザクションが検出され、ロールバックされました 

なお、分散トランザクションにおいて自律型トランザクションを使用できないバージョンがある。

ORA-00164: 移行可能な分散トランザクション内で分散自律型トランザクションの処理はできません

自律型トランザクションの例

-- エラーのログを保管しておくためのテーブル
CREATE TABLE RIVUS.ERROR_LOGS
(
	USER_CODE	NUMBER(5),
	USER_ERRM	VARCHAR2(30),
	CREATED_ON	DATE
)
/
-- 自律型トランザクションでエラーログを保存
CREATE OR REPLACE PROCEDURE RIVUS.SIMPLE_LOGGER(
	P_CODE	IN	NUMBER,
	P_ERRM	IN	VARCHAR2
)
IS
	PRAGMA AUTONOMOUS_TRANSACTION;
	-- ↑ 自律型トランザクション プラグマ
BEGIN
	INSERT INTO ERROR_LOGS(USER_CODE, USER_ERRM, CREATED_ON)
		VALUES (P_CODE, P_ERRM, SYSDATE);
	COMMIT;
	-- AUTONOMOUS_TRANSACTION が宣言されたサブプログラムでは
	-- トランザクションを終了しないとエラーになる。
END;
/
CREATE OR REPLACE PROCEDURE RIVUS.INSERT_ERROR
IS
BEGIN
 
	EXECUTE IMMEDIATE 'INSERT INTO NOT_EXISTS_TABLE VALUES (NULL)';
	-- COMMIT;  ← 絶対に失敗する予定なので必要なし
 
EXCEPTION WHEN OTHERS THEN
	DBMS_OUTPUT.PUT_LINE('例外処理しました。ORA' || SQLCODE || ':' || SQLERRM);
	-- エラーの処理のログを出力
	SIMPLE_LOGGER(SQLCODE, 'INSERT ERROR');
	ROLLBACK;
	-- ↑ メイントランザクションをロールバック
END;
/
--
-- 実行例
SQL> CALL INSERT_ERROR();
例外処理しました。ORA-942:ORA-00942: 表またはビューが存在しません。
 
コールが完了しました。
 
SQL> SELECT * FROM error_logs;
 
 USER_CODE USER_ERRM        CREATED_ON
---------- ---------------- -------------------
      -942 INSERT ERROR     2006-03-13 22:05:09
 


関連事項

自律と自立

ふと文章にしてみると自律と自立の違いについて気になりました。調べたところ、あまりにも人としての自立と自律の話題が多すぎて (自律型の人間になろう。みたいな)、ソフトウェアとしての明確な違いを見つけることを諦めました。
自立は stand alone、independence。自律は self control の言葉が浮かんだ=立と律の差ということ 結局、辞書のままか・・(autonomous という言葉は調べるまで知りませんでしたので除外)

ちなみに反対語は自律⇔他律、自立⇔依存、自立型トランザクションでも的はずれというわけでも無さそうに思える。 自立型ロボットと自律型ロボットという言葉で、その意味合いを比較するとその質感がかなり違うのでわかりやすいかも。

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー