본문 바로가기
Database

오라클 AUTONOMOUS TRANSACTION 사용법

by 굿센스굿 2024. 12. 3.
반응형


오라클 데이터베이스에서 **AUTONOMOUS TRANSACTION(자율 트랜잭션)**은 현재 트랜잭션과는 독립적으로 실행되는 트랜잭션입니다. 이를 통해 메인 트랜잭션의 상태와 관계없이 별도의 작업을 수행하고 커밋(COMMIT) 또는 **롤백(ROLLBACK)**을 할 수 있습니다. 주로 로그 기록, 감사(Auditing), 에러 처리를 위해 사용됩니다.


1. AUTONOMOUS TRANSACTION의 개념

1-1. 특징

  • 독립성: 메인 트랜잭션과 완전히 분리된 상태에서 실행됩니다.
  • 독립적 커밋/롤백: 메인 트랜잭션과 별개로 커밋하거나 롤백할 수 있습니다.
  • 사용 목적: 주요 트랜잭션의 상태에 영향을 주지 않으면서 로그 작성, 에러 로깅 등을 수행.

1-2. 동작 원리

  • AUTONOMOUS TRANSACTION 블록 내에서 실행된 작업은 메인 트랜잭션의 영향을 받지 않습니다.
  • 블록이 끝나기 전 명시적으로 COMMIT 또는 ROLLBACK을 호출해야 합니다.

2. AUTONOMOUS TRANSACTION 선언 방법

2-1. PRAGMA AUTONOMOUS_TRANSACTION

오라클 PL/SQL에서 자율 트랜잭션을 선언하려면 PRAGMA AUTONOMOUS_TRANSACTION을 사용합니다.

PRAGMA AUTONOMOUS_TRANSACTION;
  • PRAGMA: 컴파일러 지시어로, 블록이 자율 트랜잭션으로 작동하도록 설정.

2-2. 사용 위치

  • PL/SQL 블록: 프로시저, 함수, 트리거에서 사용 가능.

3. 사용법

3-1. 기본 예제: 로그 기록

CREATE OR REPLACE PROCEDURE 기록_로그(메시지 VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO 로그_테이블(로그_시간, 로그_메시지)
    VALUES (SYSDATE, 메시지);

    COMMIT; -- 메인 트랜잭션과 독립적으로 커밋
END 기록_로그;
/
  • 해석:
    • 로그_테이블에 로그 메시지를 기록.
    • COMMIT을 통해 현재 트랜잭션과 독립적으로 작업 완료.

호출

BEGIN
    기록_로그('프로세스 시작');
    -- 메인 트랜잭션 작업
END;

3-2. 트랜잭션 내 오류 로깅

CREATE OR REPLACE PROCEDURE 오류_로깅(오류_메시지 VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO 오류_로그(발생시간, 메시지)
    VALUES (SYSDATE, 오류_메시지);

    COMMIT; -- 로그 기록 완료
END 오류_로깅;
/
  • 용도: 메인 트랜잭션에서 오류가 발생해도 로그 기록은 보장됩니다.

호출

BEGIN
    -- 메인 트랜잭션
    INSERT INTO 데이터_테이블 VALUES (1, '데이터');
    
    EXCEPTION
        WHEN OTHERS THEN
            오류_로깅(SQLERRM);
            ROLLBACK; -- 메인 트랜잭션 롤백
END;

3-3. 트리거에서 AUTONOMOUS TRANSACTION 사용

CREATE OR REPLACE TRIGGER 주문_추적_트리거
AFTER INSERT ON 주문
FOR EACH ROW
DECLARE
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO 주문_로그(주문번호, 등록시간)
    VALUES (:NEW.주문번호, SYSDATE);

    COMMIT; -- 독립적으로 로그 작성
END 주문_추적_트리거;
/
  • 해석: 주문 테이블에 새 데이터가 삽입되면, 주문 로그 테이블에 기록.

4. 주의사항

  1. 명시적 커밋/롤백 필요:
    • AUTONOMOUS TRANSACTION 블록에서 반드시 COMMIT 또는 ROLLBACK을 호출해야 합니다.
    • 호출하지 않으면 데이터베이스가 에러를 발생시킵니다.
  2. 독립성의 위험:
    • 메인 트랜잭션이 롤백되더라도 자율 트랜잭션은 롤백되지 않으므로 데이터 불일치 가능성이 있습니다.
  3. 성능 주의:
    • 자율 트랜잭션 사용이 잦으면 성능 저하가 발생할 수 있습니다. 꼭 필요한 경우에만 사용하세요.
  4. 실행 권한:
    • AUTONOMOUS TRANSACTION을 사용하는 함수/프로시저/트리거는 적절한 권한이 필요합니다.

5. 실무 활용 사례

사례 1: 감사(Audit) 로그 작성

CREATE OR REPLACE PROCEDURE 감사_로그(사용자ID VARCHAR2, 작업내용 VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO 감사_테이블(사용자, 작업, 작업시간)
    VALUES (사용자ID, 작업내용, SYSDATE);

    COMMIT;
END 감사_로그;
/
  • 용도: 시스템에서 실행된 주요 작업 기록.

사례 2: 에러 기록과 재시도

CREATE OR REPLACE PROCEDURE 에러_처리(작업ID NUMBER, 오류메시지 VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO 에러_로그(작업ID, 메시지, 시간)
    VALUES (작업ID, 오류메시지, SYSDATE);

    COMMIT;
END 에러_처리;
/

BEGIN
    -- 메인 트랜잭션
    UPDATE 데이터_테이블 SET 상태 = '완료' WHERE 작업ID = 1001;

    EXCEPTION
        WHEN OTHERS THEN
            에러_처리(1001, SQLERRM);
            ROLLBACK;
END;

사례 3: 세션 간 데이터 공유

AUTONOMOUS TRANSACTION을 통해 데이터를 빠르게 커밋하고 다른 세션에서 참조할 수 있도록 설정.

CREATE OR REPLACE PROCEDURE 공유_데이터_삽입(데이터 VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    INSERT INTO 공유_테이블(내용, 생성시간)
    VALUES (데이터, SYSDATE);

    COMMIT;
END 공유_데이터_삽입;
/

6. 결론

AUTONOMOUS TRANSACTION은 데이터베이스 관리 및 트랜잭션 제어에서 강력한 도구입니다. 메인 트랜잭션과 독립적으로 로그 작성, 오류 처리, 감사 로그를 기록하는 데 활용할 수 있으며, 데이터 일관성을 유지하면서 효율적인 작업 처리를 지원합니다. 하지만 남용하면 데이터 불일치나 성능 문제를 초래할 수 있으므로 신중하게 사용해야 합니다.

궁금한 점이나 추가적으로 도움이 필요하면 언제든지 문의해주세요! 😊

반응형