본문 바로가기

DB

Oracle PL/SQL 자율 트랜잭션

반응형
  • 부모 트랜잭션 락(lock),리소스(resource), 커밋(commit)에 관련된 의존성을 가지지 않습니다. ( 부모 트랜잭션의 커밋/ 롤백 여부에 상관 없이 자신의 작업을 커밋 하거나 롤백할 수 있습니다.)
  • 부모 트랜잭션과 자율 트랜잭션은 서로 독립적이므로 락 역시 공유하지 못합니다.
  • 부모 트랜잭션에서 점유된 락(lock)을 자율 트랜잭션에서 소유하고자 한다면 데드락 현상이 발생하므로 주의 해야 합니다.

패키지 명세에서는 설정이 불가능하고 패키지 몸체 에서만 설정이 가능합니다.

 

자율 트랜잭션 생성

 

자율 트랜잭션으로 생성되어야 하는 프로시저나 함수의 경우 , 일반적인 프로시저나 함수를 정의하는 것과 거의 동일하며 선언부에 'PRAGAMA AUTONOMOUS_TRANSACTION' 구문만 추가하면 된다.

 

CREATE OR REPLACE PROCEDURE TRAN
IS
--자율트랜잭션 선언
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO DEPT VALUES(99,'AT1','AT1');
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||'INSERTED..');
COMMIT;
END;

위구무은 자율트랜잭션을 선언여 한건식 테에블에 입하도록 했다.

CREATE OR REPLACE PROCEDURE TRAN2
IS
 BEGIN
  --부모 트랜잭션에서 insert 수행
  INSERT INTO DEPT VALUES(77,'AT2','AT3');
  
  TRAN;
  
  ROLLBACK;
  
  EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE));
        END;

위구문은 부모 트랜잭션을 정의하면서 INSERT ROLLBACK 사이에 at1 프로시저가 수행되도록 했다

 

실행해보자 

EXECUTE TRAN2;

프로시저 실행후 테이블을 확인해보면 TRAN에서 실행된 프로시저는 테이블에 저장되었지만 TRAN2 부모 프로시저에서는 ROLLBACK 이 수행된걸 확인할수 이다.

TRAN프로시저 내부에서 이미 커밋이 수행되었기 때문에 부모 트랜잭션의 롤백은 의미가 없다

 

자율트랜잭션 활용방안

감사 목적의 경우 데이터를 삭제하거나 업데이트 시 수행한 사용자 정보오 변경된 이력을 저장하고 싶은 경우에 자율 트랜잭션을 사용할 수 있으며, 에러 로깅의 경우 부모 트랜잭션에 예외가 발생하여 롤백이 필요하더라도 어디 부분까지 수행이 되었고, 어느 부분에서 에러가 발생했는지를 기록하기 위해서는 별도의 커밋 작업이 필요한데 이럴때 사용한다

 

자율 트랜잭션으로 인한 데드락

자율 트랜잭션으로 선언된 자식 트랜잭션의 경우 부모 트랜잭션과는 별개로 동작하기 때문에 동일한 자원에 대해 부모와 자식 트랜잭션이 서로 점유하려고 하면 데드락이 발생할수 있기 때문에 주의해야한다.

 

CREATE OR REPLACE PROCEDURE TRAN
IS
--자율트랜잭션 선언
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO DEPT VALUES(99,'AT1','AT1');
DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||'INSERTED..');
COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE TRAN2
IS
 BEGIN
  
  --7844 사번에 대한 업데이트 수행
    UPDATE EMP SET SAL = 1000 WHERE EMPNO = 7844;
  
   TRAN;
  
  EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE));
        END;
        /

 

자율 트랜잭션의 경우 서로 별도의 트랜잭션으로 취급하기 때문에 서로의 자원을 얻기위해 대기하며 데드락을 유발한다

TRAN프로시저가 자율트랜재션 으로 선언되었기 때문에 부모 트랜잭션과 락을 공유하지 못해 데드락이 발생한다.

 

 

 

 

반응형

'DB' 카테고리의 다른 글

Oracle PL/SQL REF 커서 [ 바인드변수 사용]  (0) 2021.01.06
Oracle PL/SQL REF 커서  (0) 2021.01.06
OraclePL/SQL [커서 관리]  (0) 2021.01.03
Oracle PL/SQL [제어 구문]  (0) 2021.01.02
Oracle PL/SQL 프로시저[패키지]  (0) 2021.01.02