본문 바로가기

Database/PLSQL

067 - [Oracle PL/SQL] AUTONOMOUS TRANSACTION

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>

 

 

 

 

 

 

 

 

 

  • 블록간 구분이 없어서 subprogram 에서 실행한 commit 이 main procedure 에 영향을 미치는 샘플 코드
#case one without using PRAGMA AUTONOMOUS_TRANSACTION

drop table t;

# hr 사용자 세션에서 실행

CREATE TABLE t (test_value VARCHAR2(25));
/
CREATE OR REPLACE PROCEDURE child_block IS
BEGIN
   INSERT INTO t(test_value)
   VALUES ('Child block insert');
  COMMIT; 
END child_block;
/
CREATE OR REPLACE PROCEDURE parent_block IS
BEGIN
   INSERT INTO t(test_value)
   VALUES('Parent block insert');

child_block; -- parent_block의 인서트까지 영향을 받는다.
ROLLBACK; -- child_block 에서 commit 를 실행해서 롤백될 것이 없다.
END parent_block;
/

 -- run the parent procedure
execute parent_block;

 -- check the results
 # 
 
SELECT * FROM t;
------------------------------------------------------------
TEST_VALUE               
-------------------------
Parent block insert
Child block insert


# Parent block 에서 롤백을 했지만, 이미 커미트 처리되어 원하는 동작을 하지 않은것을 확인.

 

 

 

  • 블록간 구분이 없어서 subprogram 에서 실행한 commit 이 main procedure 에 영향을 미치는 샘플 코드
--case 2  using PRAGMA AUTONOMOUS_TRANSACTION
--this mean the  PROCEDURE child_block is independent
CREATE OR REPLACE PROCEDURE child_block IS
PRAGMA AUTONOMOUS_TRANSACTION; -- 새로운 옵션을 추가함.
BEGIN
   INSERT INTO t(test_value)
   VALUES('Child block insert');
   COMMIT;--자신의 블럭에만 영향을 미치고, parent_block 블록에는 영향이 없음.
END child_block;
/

CREATE OR REPLACE PROCEDURE parent_block IS
BEGIN
   INSERT INTO t(test_value)
   VALUES('Parent block insert');

child_block;--자신의 인서트만 commit 처리됨.
ROLLBACK; --그래서 parent_block 의 인서트는 롤백 처리됨.
END parent_block;
/

 -- empty the test table
TRUNCATE TABLE t;

 -- run the parent procedure
exec parent_block;

 -- check the results
SELECT * FROM t; 
----------------------
TEST_VALUE               
-------------------------
Child block insert

# 이전 샘플과 다르게 child_block 에서 인서트한 데이터만 입력된것을 확인.

 

 

 

  • 특징 정리, 마지막의 주의 사항 조심할 것

 

 

  • 패키지에서 사용 불가