SW/Database / / 2025. 3. 2. 19:32

ORA-08177: Can't serialize access for this transaction / 원인과 해결 방법

반응형

ORA-08177: Can't serialize access for this transaction

ORA-08177 오류는 `SERIALIZABLE` 트랜잭션 격리 수준에서 동시에 실행되는 트랜잭션이 동일한 데이터를 변경하려고 할 때 발생합니다.

 

 

 

ORA-08177: Can't serialize access for this transaction / 원인과 해결 방법

 

오류 원인

ORA-08177 오류는 다음과 같은 원인으로 인해 발생할 수 있습니다:

  1. 동일한 데이터에 대한 동시 변경 시도: - `SERIALIZABLE` 모드에서는 다른 트랜잭션이 데이터를 변경하면 현재 트랜잭션이 롤백됩니다.
  2. 트랜잭션 간 충돌: - 여러 트랜잭션이 동일한 테이블의 동일한 행을 수정하려 할 때 발생할 수 있습니다.
  3. 장시간 실행되는 트랜잭션: - 오래 지속되는 트랜잭션이 많은 경우 충돌 가능성이 높아집니다.

해결 방법

ORA-08177 오류를 해결하기 위해 다음 단계를 수행할 수 있습니다:

  1. 트랜잭션 격리 수준 변경: - `SERIALIZABLE` 대신 `READ COMMITTED` 모드를 사용하면 충돌을 줄일 수 있습니다.
    ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
  2. 재시도 로직 추가: - 오류가 발생하면 트랜잭션을 다시 시도하도록 애플리케이션을 수정합니다.
    BEGIN
      LOOP
        BEGIN
          -- 트랜잭션 실행
          COMMIT;
          EXIT;
        EXCEPTION
          WHEN OTHERS THEN
            -- 오류 발생 시 재시도
            ROLLBACK;
        END;
      END LOOP;
    END;
  3. 트랜잭션 크기 줄이기: - 한 번에 변경하는 데이터의 양을 줄이고, 작은 단위로 커밋하는 것이 좋습니다.
  4. 충돌 가능성이 높은 작업 피하기: - `SELECT ... FOR UPDATE` 사용을 최소화하고, 동시 업데이트가 필요한 경우 로직을 조정합니다.

간단 요약

  • ORA-08177 오류는 `SERIALIZABLE` 모드에서 데이터 충돌이 발생할 때 나타납니다.
  • 해결 방법: - `READ COMMITTED` 모드로 변경 (`ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;`) - 트랜잭션 재시도 로직 추가 - 트랜잭션 크기 줄이기 및 빈번한 커밋 적용 - `SELECT ... FOR UPDATE` 사용 최소화
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유