2012年10月7日日曜日

PL/SQLの Autonomous Transactions

AUTONOMOUS_TRANSACTIONプラグマを使用すると自律型のトランザクションを定義できます。
このトランザクションは、メイントランザクションと独立しているので、サブプロシージャないの処理を確実にコミットすることができます。
PL/SQLでログテーブルに書き込むときなどに使えるのではないでしょうか。

この無名PL/SQLは、innerサブプロシージャが自律型のトランザクションとなっています。
自律型トランザクション部分のtest1へのinsert処理は必ずコミットされます。
メイントランザクションではロールバックされるので、testへのinsertは取り消されます。
declare
  procedure inner
  is
    PRAGMA AUTONOMOUS_TRANSACTION;
  begin
    insert into test1 values ('1');
    commit;
  end;
begin
    insert into test values ('1');
    inner;
    rollback;
end;
/

実行前

test、test1ともテーブルは空です。
10:22:39 SQL> select * from test;

no rows selected

Elapsed: 00:00:00.00
10:27:56 SQL> select * from test1;

no rows selected

実行

10:27:43 SQL> r
  1  declare
  2    procedure inner
  3    is
  4  PRAGMA AUTONOMOUS_TRANSACTION;
  5    begin
  6  insert into test1 values ('1');
  7  commit;
  8    end;
  9  begin
 10  insert into test values ('1');
 11  inner;
 12  rollback;
 13* end;

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.04
10:28:07 SQL>

実行後

自律型トランザクションのtest1だけinsertされていることがわかる。
10:28:01 SQL> select * from test;

no rows selected

Elapsed: 00:00:00.00
10:28:21 SQL> select * from test1;

C
-
1

Elapsed: 00:00:00.00
10:28:25 SQL>