반응형
ORA-08177: Can't serialize access for this transaction
ORA-08177 오류는 `SERIALIZABLE` 트랜잭션 격리 수준에서 동시에 실행되는 트랜잭션이 동일한 데이터를 변경하려고 할 때 발생합니다.

오류 원인
ORA-08177 오류는 다음과 같은 원인으로 인해 발생할 수 있습니다:
- 동일한 데이터에 대한 동시 변경 시도: - `SERIALIZABLE` 모드에서는 다른 트랜잭션이 데이터를 변경하면 현재 트랜잭션이 롤백됩니다.
- 트랜잭션 간 충돌: - 여러 트랜잭션이 동일한 테이블의 동일한 행을 수정하려 할 때 발생할 수 있습니다.
- 장시간 실행되는 트랜잭션: - 오래 지속되는 트랜잭션이 많은 경우 충돌 가능성이 높아집니다.
해결 방법
ORA-08177 오류를 해결하기 위해 다음 단계를 수행할 수 있습니다:
- 트랜잭션 격리 수준 변경: - `SERIALIZABLE` 대신 `READ COMMITTED` 모드를 사용하면 충돌을 줄일 수 있습니다.
ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;
- 재시도 로직 추가: - 오류가 발생하면 트랜잭션을 다시 시도하도록 애플리케이션을 수정합니다.
BEGIN LOOP BEGIN -- 트랜잭션 실행 COMMIT; EXIT; EXCEPTION WHEN OTHERS THEN -- 오류 발생 시 재시도 ROLLBACK; END; END LOOP; END;
- 트랜잭션 크기 줄이기: - 한 번에 변경하는 데이터의 양을 줄이고, 작은 단위로 커밋하는 것이 좋습니다.
- 충돌 가능성이 높은 작업 피하기: - `SELECT ... FOR UPDATE` 사용을 최소화하고, 동시 업데이트가 필요한 경우 로직을 조정합니다.
간단 요약
- ORA-08177 오류는 `SERIALIZABLE` 모드에서 데이터 충돌이 발생할 때 나타납니다.
- 해결 방법: - `READ COMMITTED` 모드로 변경 (`ALTER SESSION SET ISOLATION_LEVEL = READ COMMITTED;`) - 트랜잭션 재시도 로직 추가 - 트랜잭션 크기 줄이기 및 빈번한 커밋 적용 - `SELECT ... FOR UPDATE` 사용 최소화
반응형