2026년 08월 30일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-06519 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-06519 active autonomous transaction detected and rolled back 는?
ORA-06519 에러는 자율 트랜잭션(Autonomous Transaction)으로 선언된 프로그램 단위(프로시저, 함수, 트리거 등)가 종료될 때 아직 커밋(COMMIT) 또는 롤백(ROLLBACK)되지 않은 활성 트랜잭션이 남아 있을 경우 발생합니다. Oracle 엔진은 이 상황을 감지하면 해당 자율 트랜잭션을 강제로 롤백시키고 호출자에게 ORA-06519 예외를 던집니다. 즉, 개발자가 자율 트랜잭션 블록 내에서 DML(INSERT, UPDATE, DELETE) 작업을 수행한 뒤 명시적인 COMMIT 또는 ROLLBACK 없이 블록을 빠져나가려 할 때 반드시 마주치게 되는 에러입니다.
주요 발생 원인
1. 자율 트랜잭션 내 COMMIT/ROLLBACK 누락
가장 빈번한 원인입니다. PRAGMA AUTONOMOUS_TRANSACTION을 선언한 서브프로그램에서 DML을 실행한 후 COMMIT 또는 ROLLBACK을 명시적으로 호출하지 않으면 Oracle은 해당 트랜잭션이 여전히 활성 상태임을 감지하고 강제 롤백과 함께 ORA-06519를 발생시킵니다. 특히 복잡한 비즈니스 로직 구현 시 예외 처리 경로나 조건 분기에서 COMMIT/ROLLBACK이 빠지는 경우가 많습니다.
2. 예외 처리(Exception Handler) 미흡으로 인한 비정상 종료
자율 트랜잭션 내부에서 런타임 예외가 발생했을 때, EXCEPTION 블록에서 ROLLBACK을 수행하지 않고 예외를 그냥 다시 상위로 전파(RE-RAISE)하거나 아예 예외 블록이 없는 경우입니다. 이 경우 DML 작업이 실행된 상태에서 트랜잭션이 열린 채로 서브프로그램이 종료되므로, Oracle이 이를 강제 롤백하면서 ORA-06519가 함께 발생합니다.
3. 동적 SQL(EXECUTE IMMEDIATE) 또는 중첩 호출 구조에서의 누락
동적 SQL을 사용하여 자율 트랜잭션 내부에서 DML을 실행하거나, 자율 트랜잭션을 가진 함수/프로시저를 중첩 호출하는 구조에서 COMMIT 타이밍을 놓치는 경우입니다. 동적 SQL은 코드 흐름을 추적하기 어려워 COMMIT이 실행되지 않는 경로가 생기기 쉽고, 특히 조건에 따라 동적 SQL이 실행되거나 건너뛰어지는 로직에서 자주 발생합니다.
해결 방법
원인 1 해결: COMMIT/ROLLBACK 명시적 추가
자율 트랜잭션 프로시저의 모든 종료 경로에 반드시 COMMIT 또는 ROLLBACK을 배치합니다.
-- 잘못된 예 (ORA-06519 발생)
CREATE OR REPLACE PROCEDURE log_audit_bad (
p_user IN VARCHAR2,
p_action IN VARCHAR2
) AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO audit_log (log_user, log_action, log_date)
VALUES (p_user, p_action, SYSDATE);
-- COMMIT 누락! -> ORA-06519 발생
END;
/
-- 올바른 예 (COMMIT 명시)
CREATE OR REPLACE PROCEDURE log_audit_good (
p_user IN VARCHAR2,
p_action IN VARCHAR2
) AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO audit_log (log_user, log_action, log_date)
VALUES (p_user, p_action, SYSDATE);
COMMIT; -- 반드시 명시적 COMMIT
END;
/
원인 2 해결: 예외 처리 블록에 ROLLBACK 추가
EXCEPTION 블록에서 반드시 ROLLBACK을 수행한 후 예외를 전파하거나 처리해야 합니다.
CREATE OR REPLACE PROCEDURE log_audit_safe (
p_user IN VARCHAR2,
p_action IN VARCHAR2
) AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO audit_log (log_user, log_action, log_date)
VALUES (p_user, p_action, SYSDATE);
-- 추가 처리 로직
UPDATE audit_summary
SET action_count = action_count + 1
WHERE log_user = p_user;
COMMIT; -- 정상 경로 COMMIT
EXCEPTION
WHEN OTHERS THEN
ROLLBACK; -- 예외 발생 시 반드시 ROLLBACK
-- 에러 로깅 또는 재발생
RAISE; -- 필요 시 상위로 예외 전파
END;
/
원인 3 해결: 동적 SQL 사용 시 COMMIT 보장
동적 SQL이 포함된 자율 트랜잭션에서는 모든 분기 경로에 COMMIT/ROLLBACK을 배치합니다.
CREATE OR REPLACE PROCEDURE dynamic_log_proc (
p_table_name IN VARCHAR2,
p_message IN VARCHAR2
) AS
PRAGMA AUTONOMOUS_TRANSACTION;
v_sql VARCHAR2(500);
BEGIN
-- 동적 SQL로 DML 실행
v_sql := 'INSERT INTO ' || DBMS_ASSERT.SIMPLE_SQL_NAME(p_table_name)
|| ' (message, log_date) VALUES (:1, SYSDATE)';
EXECUTE IMMEDIATE v_sql USING p_message;
COMMIT; -- 동적 SQL 후에도 반드시 COMMIT
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
-- 에러 내용을 별도 테이블에 기록하거나 로깅
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
RAISE;
END;
/
실무 디버깅 팁: 에러 발생 위치 확인
-- 에러 발생 스택 추적을 위한 테스트 블록
BEGIN
log_audit_bad('TESTUSER', 'LOGIN');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error Code : ' || SQLCODE);
DBMS_OUTPUT.PUT_LINE('Error Message: ' || SQLERRM);
DBMS_OUTPUT.PUT_LINE('Call Stack : ');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_CALL_STACK);
DBMS_OUTPUT.PUT_LINE('Error Stack : ');
DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK);
END;
/
예방 방법
1. 자율 트랜잭션 코딩 표준(Coding Standard) 수립 및 코드 리뷰 의무화
PRAGMA AUTONOMOUS_TRANSACTION을 사용하는 모든 서브프로그램은 반드시 COMMIT과 ROLLBACK을 포함하는 표준 템플릿을 사용하도록 팀 내 코딩 표준을 수립하십시오. 코드 리뷰 체크리스트에 “자율 트랜잭션 내 COMMIT/ROLLBACK 존재 여부 확인” 항목을 필수로 포함시켜, 개발 단계에서 누락을 사전에 차단하는 것이 가장 효과적인 예방책입니다. 또한 CI/CD 파이프라인에 정적 분석 도구를 연동하여 COMMIT/ROLLBACK 누락 패턴을 자동으로 감지하는 것도 권장합니다.
2. 단위 테스트(Unit Test) 및 예외 경로 테스트 철저히 수행
자율 트랜잭션 프로그램 단위에 대해 정상 경로뿐 아니라 다양한 예외 상황(NO_DATA_FOUND, TOO_MANY_ROWS, DUP_VAL_ON_INDEX 등)을 강제로 발생시키는 단위 테스트를 작성하십시오. utPLSQL 또는 dbms_unit 같은 Oracle PL/SQL 전용 테스트 프레임워크를 활용하면 모든 코드 경로에서 트랜잭션이 올바르게 종료되는지 자동으로 검증할 수 있습니다. 이를 통해 ORA-06519뿐 아니라 유사한 트랜잭션 관련 버그를 조기에 발견할 수 있습니다.
관련 에러
- ORA-06501:
PL/SQL: program error— PL/SQL 내부 오류로, 자율 트랜잭션과 관련된 내부 상태 문제 시 함께 나타날 수 있습니다. - ORA-04092:
cannot COMMIT in a trigger— 일반 트리거에서 COMMIT을 시도할 때 발생하며, 자율 트랜잭션 트리거와 혼동하지 않도록 주의가 필요합니다. 자율 트랜잭션으로 선언된 트리거는 COMMIT이 가능합니다. - ORA-04091:
table is mutating, trigger/function may not see it— 트리거 내에서 자율 트랜잭션을 사용하는 경우 Mutating Table 문제를 우회하려다 ORA-06519와 함께 발생할 수 있습니다. - ORA-01453:
SET TRANSACTION must be first statement of transaction— 자율 트랜잭션 내에서 트랜잭션 제어 설정 순서가 잘못된 경우 연관되어 나타날 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.