상황
update쿼리를 날리는 함수인 updateState에서 TransactionRequiredException :Executing an update/delete query 에러가 발생
@Override
public Long updateState(
LocalDate date,
UserChallengeStateType beforeState,
UserChallengeStateType afterState
) {
final Predicate[] predicates = new Predicate[]{
qUserChallenge.state.eq(beforeState),
qUserChallenge.startDate.eq(date)
};
long resultCount = update(qUserChallenge)
.set(qUserChallenge.state, afterState)
.where(predicates)
.execute();
return resultCount;
}
원인
-update,delete 쿼리문 실행하는 함수에서 transaction 처리가 필요하다. 조회인 select 문을 실행하는 중에 에러가 발생하면 해당 데이터는 문제가 없지만 update나 delete를 하는 경우에는 에러가 생겼을 때 다시 롤백이 되어야한다.
해결
@Transactional
@Override
public Long updateState(
LocalDate date,
UserChallengeStateType beforeState,
UserChallengeStateType afterState
)
@Transactional 을 추가한다.
여기서 주의할 점은 패키지를 javax.transaction.Transactional가 아닌 org.springframework.transaction.annotation.Transactional을 import 해야한다.
그렇지 않으면 에러가 계속 발생하다.
결론
org.springframework.transaction.annotation.Transactional의 @Transactional을 사용하자
추가적으로
javax.transaction.Transactional vs org.springframework.transaction.annotation.Transactional의 차이는 뭘까?
javax.transaction.Transactional
CDI로 관리되는 bean와 Java EE 규격에 따라 관리되는 bean으로 정의된 클래스에 적용된다.
org.springframework.transaction.annotation.Transactional
스프링에서 제공해주는 것으로 readonly,isolation 등과 같은 추가적인 부가 기능을 지원해준다.
Spring Framework에서 지원하는 @Transactional 어노테이션을 사용하는 것을 권장한다.왜냐하면 @Transactional이 더 많은 부가 기능인 옵션을 지원해주기 때문이다.
'Backend > Spring | Spring Boot' 카테고리의 다른 글
[예외 처리] 사용자 정의 예외 처리 (0) | 2024.06.07 |
---|---|
[Spring] Filter와 OncePerRequestFilter (0) | 2024.03.13 |
[SpringBoot] @PostConstructd와 @PreDestroy (0) | 2024.02.22 |
[spring-data-jpa] @Transactional 의 readonly 옵션과 성능 향상 (0) | 2023.01.27 |
[Spring Boot] Lombok이란? Lombok 추가하기 (0) | 2023.01.21 |