ORA-12838: cannot read/modify an object after modifying it in parallel 해결하기

ORA-12838: cannot read/modify an object after modifying it in parallel 오류는 오라클 데이터베이스에서 병렬 처리 중인 작업 중에, 커밋 또는 롤백이 되지 않은 상태에서 동일한 객체를 다시 수정하려고 할 때 발생하는 오류입니다.

해당 오류는 일반적으로 병렬 DML 작업 중에 발생합니다. 때문에 병렬 처리에 의한 동시 수정 작업이 일어나는 경우, 해당 객체에 대한 설정을 변경하거나 동시성 제어를 추가해야 합니다.

ORA-12838 cannot readmodify an object after modifying it in parallel

다음은 ORA-12838: cannot read/modify an object after modifying it in parallel 오류가 발생하도록 유도한 간단한 예제입니다. APPEND 힌트를 부여했으며, 인서트가 이루어진 다음 다시 인서트를 시도하는 경우에 해당 오류가 발생한답니다.

SQL> INSERT /*+ APPEND */
           INTO TABLE_NAME (COLUMN_NAME)
        SELECT '1' FROM DUAL;

1 row created.

SQL> INSERT /*+ APPEND */
           INTO TABLE_NAME (COLUMN_NAME)
        SELECT '1' FROM DUAL;

ERROR at line 2:
ORA-12838: cannot read/modify an object after modifying it in parallel

해당 오류를 수정하려면 객체에 대한 일회성 데이터조작을 원하는 경우, 커밋과 롤백이 적절하게 이루어질 수 있도록 보완합니다. 또는 APPEND 힌트를 제거하는 등 동일한 객체에 대한 수정이 가능하도록 검토합니다.

패러럴 DML 허용 설정 변경 => 이 오류는 데이터베이스가 패러럴 DML 처리를 허용하는 경우 발생할 수 있습니다. 이를 해결하기 위해 허용 설정을 변경을 검토합니다.

작업 분리 => 동일한 객체에 대한 병렬 작업이 발생할 수 있는 경우, 작업을 분리하여 서로 다른 객체에 대해 병렬 작업을 수행하도록 설계할 수 있습니다.

예제에서는 [INSERT]만 보여드렸는데, 인서트 이후에 [SELECT]를 시도하는 경우에도 동일한 오류가 발생합니다. 오류를 잘 보시면 ORA-12838: cannot read/modify an object after modifying it in parallel라고 적혀있습니다. 모디파이뿐만 아니라 리드도 오류가 난답니다.

댓글