미해결
실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Scheduled 사용 시 @Transactional 메소드 사용 실패 관련
안녕하세요, 강의 잘 듣고 있습니다!!
JPA 사용 중에 강의만으로는 어려운 문제를 만나 문의드립니다! JPA 트랜잭션에 대한 오류인것 같고 꽤 오래 찾아았으나, 아직 답을 찾지 못했습니다.
현상은 @Scheduled 가 추가된 메소드에서 다른 서비스 A의 @Transactional 메소드를 호출 시 아래와 같은 에러가 발생합니다.
예시)
@Transactional
public void changeStatus(Long id, String status) {
Obj o = objRepository.findById(id).get();
o.setStatus(status);
}
환경
SpringBoot 2.4 이며, 자동으로 설정되는 JpaTransactionManager 를 사용합니다.
==============
에러 메시지
==============
2021-08-30 18:14:17.536 ERROR 18252 --- [ scheduler-1] o.s.s.s.TaskUtils$LoggingErrorHandler.handleError:95 - Unexpected error occurred in scheduled task org.springframework.orm.jpa.JpaSystemException: Unable to perform beforeTransactionCompletion callback: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.; nested exception is org.hibernate.HibernateException: Unable to perform beforeTransactionCompletion callback: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:331)
Trace 로그로 볼 때에는 transaction marked for rollback only 라는 메시지도 나옵니다.
변경 감지로 할 경우와, save 메소드를 호출하는 경우 모두 발생하구요..
제가 무언가 놓치고 있는 게 있다면, 조언 부탁드립니다!!