1. 개요
간단한 ItemReader를 작성한 후 실행시켰는데 다음과 같은 트랜잭션 관련 에러가 발생했다.
java.lang.IllegalStateException: Transaction already active
at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final]
at org.springframework.batch.item.database.JpaPagingItemReader.doReadPage(JpaPagingItemReader.java:193) ~[spring-batch-infrastructure-4.3.8.jar:4.3.8]
...
트랜잭션을 시작하는 부분을 확인해보니 isActive()가 true여서 에러가 발생했다.
isActive()로 들어가보면 함수 내부에서 isMarkedForRollbackConsiderdActive 파라미터의 값으로 true를 넘기고 있는 것을 확인할 수 있다. 함수의 끝까지 따라가보자.
최종적으로는 트랜잭션이 이미 활성화중인 상태이거나 트랜잭션이 롤백으로 체크된 경우에 isActive()가 true를 반환하는 것을 확인할 수 있다. 여기서는 트랜잭션이 롤백으로 체크된 상태였다.
2. 해결
트랜잭션이 롤백으로 체크됐다는 것은 쿼리를 실행하는 과정에서 문제가 생겼다는 것이다. ItemReader로 돌아와서 작성한 JPQL문을 보니 문제를 알 수 있었다. JPQL 상의 Entity명이 잘못돼서 제대로 SELECT를 수행하지 못한 것이었다. 이를 수정하니 정상적으로 잡이 실행됐다.
3. 참고
- https://www.inflearn.com/questions/555454/%EC%A2%8B%EC%9D%80-%EA%B0%95%EC%9D%98-%EA%B0%90%EC%82%AC%ED%95%A9%EB%8B%88%EB%8B%A4-%EC%A7%88%EB%AC%B8%EC%9D%B4-%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4
- https://dahye-jeong.gitbook.io/spring/spring/2020-03-23-batch/2021-12-08-scaling-out/2021-12-09-multithread-error#transaction-already-active