고코딩

AUTONOMOUS TRANSACTION, 독립적인 트랜잭션(오라클) 본문

DB

AUTONOMOUS TRANSACTION, 독립적인 트랜잭션(오라클)

고코딩 2021. 8. 13. 11:05

AUTONOMOUS TRANSACTION, 독립적인 트랜잭션

프로시저에서 프로시저를 호출하고 또 프로시저에서 프로시저를 호출하면서 점점 TRANSACTION의 위치가 애매해지기 시작했다. 그래서 프로시저마다 독립적인 트랜잭션을 할당해 줄수는 없을까 싶어서 찾아보다가 AUTONOMOUS TRANSACTION을 발견하였다.


AUTONOMOUS TRANSACTION이란?

블록에서 자신의 작업을 수행하기 위해서 그 블록의 고유의 트랜잭션을 생성하는 경우에 해당하며 그 불록의 트랜잭션의 결과가 자신을 포함하거나 호출한 트랜잭션에의 상태에 의해 영향을 받지 않는 속정을 가지는 트랜잭션을 의미한다.

마스터 트랜잭션과는 lock, resource, commit에 관련된 의존성을 가지지 않는다.

테스트를 통해서 살펴보자

TEST_PROCEDURE1

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE1
IS
BEGIN
    INSERT INTO ADDRESS(
                         ADDRESS_ID
                       , ZIP_CD
                        ) VALUES(
                         CSV_SEQUENCE.NEXTVAL
                       , 'A1' 
                        );
    COMMIT;
END;

TEST_PROCEDURE2

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE2
IS
BEGIN
     INSERT INTO ADDRESS(
                         ADDRESS_ID
                       , ZIP_CD
                        ) VALUES(
                         CSV_SEQUENCE.NEXTVAL
                       , 'B1' 
                        );
     TEST_PROCEDURE1;
     ROLLBACK;
    -- COMMIT;
END;

구조는 TEST_PROCEDURE2프로시져내에서 TEST_PROCEDURE1이 호출된다. TEST_PROCEDURE1'A1값을 ADDRESS 테이블에 넣고 COMMIT한다. 이후 'TEST_PROCEDURE2`프로시저에서 ROLLBACK이 이루어진다.

내가 원하는 의도는 TEST_PROCEDURE1INSERT문은 독립적인 트랜잭션으로 실행되고 싶다 이 말인 즉 ROLLBACK 되었을 때 B1은 없고 A1만 ADDRESS테이블에 값이 들어가 있기를 바란다.

EXEC TEST_PROCEDURE2 명령어를 실행한후 조회해보면

image

으잉?? TEST_PROCEDURE2의 입장에서 봤을 때 ROLLBACK 했으므로 B1은 없어야 정상이다. 근데 B1이 INSERT 되었다.

그 이유는 두개의 프로시저가 같은 트랜잭션 블록에 포함되어있기 때문에 TEST_PROCEDURE1에서 COMMIT이 되어버려 B1도 COMMIT이 되어버린 것이다.

방법은 TEST_PROCEDURE1의 트랜잭션을 독립적(다른 트랜잭션에 영향받지 않게)으로 만들어 주면 된다. TEST_PROCEDURE1을 수정해보자.

TEST_PROCEDURE1

CREATE OR REPLACE PROCEDURE TEST_PROCEDURE1
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO ADDRESS(
                                        ADDRESS_ID
                                      , ZIP_CD
                        ) VALUES(
                                        CSV_SEQUENCE.NEXTVAL
                                      , 'A1' 
                        );
    COMMIT;
    --ROLLBACK;
END;

TEST_PROCEDURE1프로시저에 PRAGMA AUTONOMOUS_TRANSACTION;로 독립트랜잭션을 정의해주었다.

기존에 INSERT된 정보들을 지운 후 다시 EXEC TEST_PROCEDURE2;를 실행해주자

image

원하는 결과가 나왔다.!! 이런식으로 AUTONOMOUS_TRANSACTION을 지정해주면 프로시져에게 독립적인 트랜잭션을 할당해 줄 수 있다.


참고로 나는 오라클에서 진행했다. 다른 DB는 어떻게 되는지 모르겠다.

'DB' 카테고리의 다른 글

Oracle DB 계정 대소문자 구분  (0) 2021.07.02
오라클 프로시져 ROLLBACK COMMIT 기준  (0) 2021.06.26