[API] UnexpectedRollbackException 500 Error

2025. 1. 10. 23:17iOS

반응형

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

 

 

오류 메시지에서 알 수 있는 점은 다음과 같습니다:

  1. 오류 타입
    org.springframework.transaction.UnexpectedRollbackException은 Spring Framework의 트랜잭션 관리에서 발생하는 예외입니다. 이 예외는 트랜잭션이 커밋되기 전에 이미 "롤백 전용(rollback-only)"으로 표시되었을 때 발생합니다.
  2. 오류 원인
    트랜잭션이 rollback-only 상태가 되는 이유는 다양합니다:
    • 트랜잭션 내부에서 **예외(Exception)**가 발생했을 때, 트랜잭션 관리자가 이를 감지하고 롤백 전용으로 설정했을 수 있습니다.
    • 개발자가 명시적으로 TransactionStatus.setRollbackOnly() 메서드를 호출했을 수 있습니다.
    • 선언적 트랜잭션 관리에서 예외 처리가 올바르게 설정되지 않아 예상치 못한 동작이 발생했을 수 있습니다.
  3. 오류 메시지
    Transaction silently rolled back because it has been marked as rollback-only는 트랜잭션이 정상적으로 완료될 수 없는 상태로 변경되었기 때문에 커밋 대신 롤백이 발생했다는 의미입니다.
  4. 관련 HTTP 상태 코드
    ret = 500은 HTTP 500 내부 서버 오류를 나타냅니다. 이는 서버에서 처리되지 않은 예외나 비정상적인 동작이 있었음을 의미합니다.

문제 해결 방법

  1. 로그 분석
    rollback-only 상태로 변경된 시점을 찾기 위해 전체 트랜잭션 흐름과 관련된 로그를 분석하세요.
  2. 예외 처리 확인
    트랜잭션 내에서 발생한 예외를 확인하고 올바르게 처리되었는지 검토하세요.
    • try-catch 블록으로 필요한 예외를 잡고 처리하세요.
    • @Transactional 설정에서 rollbackFor와 noRollbackFor 속성을 확인하세요.
  3. 코드 디버깅
    트랜잭션 경계(transaction boundary) 내부 코드에서 명시적으로 setRollbackOnly()가 호출되었는지 확인하세요.
  4. 트랜잭션 설정 확인
    선언적 트랜잭션(@Transactional)이 올바르게 설정되었는지 확인하세요.
    • 트랜잭션 전파(Propagation) 속성
    • 예외 변환(Exception Translation) 설정
  5. Spring AOP 또는 트랜잭션 관리자 확인
    PlatformTransactionManager의 설정이나 AOP 기반 트랜잭션 처리 로직에서 문제는 없는지 점검하세요.

이 메시지는 주로 트랜잭션과 관련된 로직의 오류에서 발생하므로, 위 단계를 통해 문제의 원인을 파악할 수 있을 것입니다.

반응형