본문 바로가기

Note

[SQL] 자율 트랜잭션(Autonomous Transaction)

DB2 V9.7 FixPack3 에서 도입된 기능이다.

저장 프로시저(Stored Procedure) 내부에서 호출되는 저장 프로시저의 트랜잭션 처리를 “호출한 저장 프로시저 트랜잭션 상태”와 상관없이 DB에 반영(commit)할 수 있게 하는 기능이다.

다른 DBMS에서는 어떤 용도로 사용되는지 찾아보질 않아 모르겠지만, 곰곰이 생각해 보면 업무적으로 “특수한 요건”일 때 적용이 될 법하고, 이외는 “호출한/호출당한 저장 프로시저”의 트랜잭션 수행 기록을 남기는 용도로 사용할 수도 있지 않나 싶다.

먼가 중요한 처리를 담당하는 “저장 프로시저”인 경우, 이 저장 프로시저가 수행될 때 마다 처리한 트랜잭션들을 기록하도록 하기 위해 (commit 이던 rollback이던) “자율 트랜잭션”을 사용할 필요가 있지 않을까 하는 생각을 해본다.

테스트는 오라클 호환 벡터를 설정하고 테스트를 하였다.(오라클 관련 호환성 기능 테스트를 병행하고 있었기에..)  (DB2_COMPATIBILITY_VECTOR=ORA)

호출되는 내부 저장 프로시저 생성

db2 +p -td"@" -v << EOF
connect to sample @
drop table t1 @
create table t1(c1 timestamp) @
create or replace procedure sp2()
language sql
autonomous
begin
      insert into t1 values (current timestamp) ;
end
@
terminate @
EOF

선언부에 “Autonomous”를 명시한다.

 

호스트 저장 프로시저 생성

db2 +p -td"@" -v << EOF
connect to sample @
drop table t3@
create table t3 (c1 timestamp)@
create or replace procedure sp3()
begin
       insert into t3 values (current timestamp) ;
       call sp2();
end
@
terminate @
EOF

프로시저 sp2를 auto commit를 해제하고 수행 후, rollback을 수행함으로써 autonomous가 적용되었는지를 확인한다.

저장 프로시저 실행

$ db2 +c "call sp3()"

  Return Status = 0


$ db2 rollback

DB20000I  The SQL command completed successfully.

 

SP3프로시저의 수행 결과 확인

$ db2 "select * from t3"

C1
--------------------------

  0 record(s) selected.

SP2 프로시저의 수행 결과 확인

$ db2 "select * from t1"

C1
--------------------------
2011-10-17-17.46.39.148931

  1 record(s) selected.