JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
自律型トランザクション (Autonomous Transactions)
自律型トランザクションプラグマ (PRAGMA AUTONOMOUS_TRANSACTION) は、メイントランザクション(以降 MT )とは独立した 自律トランザクション(以降 AT ) を宣言するためのものである。
注意:自立型トランザクションという表記は正しくない。
自律型トランザクションのメリット
MT 処理の中にエラー処理のログや監査のログを永続テーブルに書き込むことなどが可能
2つのトランザクションは独立しているため MT と AT においてロールバック
を行なっても互いのトランザクションに影響がない。
トリガー を自律型トランザクションにするとトリガー内で COMMIT 、ROLLBACK を記述することも可能。
(注意)自律型トランザクションは宣言したプロシージャの終了までに内部のトランザクションを完了させる必要がある。
さもないと自律トランザクションはロールバックされ、呼び出し元に以下の例外が通知される。
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 という言葉は調べるまで知りませんでしたので除外)
ちなみに反対語は自律⇔他律、自立⇔依存、自立型トランザクションでも的はずれというわけでも無さそうに思える。
自立型ロボットと自律型ロボットという言葉で、その意味合いを比較するとその質感がかなり違うのでわかりやすいかも。