SW/Database / / 2025. 2. 2. 15:18

ORA-02089: COMMIT is not allowed in a subordinate session / 원인과 해결 방법

반응형

ORA-02089: COMMIT is not allowed in a subordinate session

ORA-02089 오류는 2PC(이상 트랜잭션 처리) 환경에서 하위 세션에서 COMMIT 명령을 실행할 때 발생합니다.

 

 

ORA-02089: COMMIT is not allowed in a subordinate session / 원인과 해결 방법

 

 

오류 원인

ORA-02089 오류는 다음과 같은 상황에서 발생할 수 있습니다:

  1. 2PC(이상 트랜잭션 처리) 환경에서 하위 세션에서 COMMIT 수행: Oracle의 분산 트랜잭션(Distributed Transaction)에서는 트랜잭션을 제어하는 상위 세션만이 COMMIT을 수행할 수 있습니다.
  2. XA 트랜잭션 또는 DB 링크를 통해 연결된 세션에서 COMMIT 실행: XA 또는 DB 링크를 통한 트랜잭션에서는 COMMIT이 제한될 수 있습니다.
  3. PL/SQL 블록 내에서 하위 트랜잭션이 COMMIT을 실행: PL/SQL에서 SAVEPOINT를 사용한 후 하위 트랜잭션 내에서 COMMIT을 실행하면 오류가 발생할 수 있습니다.

해결 방법

ORA-02089 오류를 해결하는 방법은 다음과 같습니다:

  1. 상위 트랜잭션에서 COMMIT 실행: 트랜잭션을 제어하는 메인 세션에서 COMMIT을 수행해야 합니다. 하위 세션에서는 COMMIT을 직접 실행할 수 없습니다.
    -- 하위 세션에서는 COMMIT이 불가능
    COMMIT; -- ORA-02089 오류 발생
    
    -- 대신 상위 트랜잭션에서 실행해야 함
    EXEC DBMS_TRANSACTION.COMMIT;
  2. DB 링크를 통한 트랜잭션 관리: DB 링크를 사용할 경우, `COMMIT`을 상위 세션에서 실행해야 합니다.
    SET TRANSACTION READ WRITE;
    INSERT INTO remote_table@dblink VALUES ('Test');
    COMMIT; -- 오류 발생 가능
    위와 같은 상황에서는 상위 세션에서 `COMMIT`을 실행해야 합니다.
  3. PL/SQL에서 EXECUTE IMMEDIATE 사용: PL/SQL 블록 내부에서 트랜잭션을 종료하려면 `EXECUTE IMMEDIATE`를 사용하여 COMMIT을 실행해야 합니다.
    BEGIN
       EXECUTE IMMEDIATE 'COMMIT';
    END;
    /
    
  4. SAVEPOINT를 사용하여 트랜잭션 유지: COMMIT 대신 SAVEPOINT를 사용하여 트랜잭션을 유지하고, 필요한 경우 ROLLBACK을 수행합니다.
    SAVEPOINT before_commit;
    -- 일부 작업 수행
    ROLLBACK TO SAVEPOINT before_commit;

간단 요약

  • ORA-02089 오류는 하위 세션에서 `COMMIT`을 실행할 수 없을 때 발생합니다.
  • 해결 방법: - 상위 트랜잭션에서 COMMIT 실행 - DB 링크 트랜잭션 관리 - PL/SQL에서 EXECUTE IMMEDIATE 사용 - SAVEPOINT 활용
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유