트랜잭션 예외
90
작성한 질문수 2
안녕하세요, 선언적 트랜잭션을 사용하였지만 제 예상과 다르게 서비스 로직이 롤백되지 않고 끝까지 실행되는 현상이 있어서 자문을 구합니다.
실행 시킨 코드는
Job, Step, Tasklet으로 구성된 간단한 로직입니다.
Tasklet에서 DB CUD 작업을 수행하는 Service 클래스를 호출하여 사용하고 있습니다.
코드 흐름 예시)
@RequiredArgsConstructor
public class TestService {
private final TestMapper mapper;
@Transaction(rollbackFor = Exception.class)
public void update() {
mapper.update1();
mapper.update2();
}
}
update1을 수행 중, SQL 레벨에서 예외 발생
(ex. PSQL Exception)
기대결과
update1 예외 및 롤백
update2를 실행하지 않고 서비스 로직 중단
실제결과
update1 예외
update2 실행 후 커밋
무엇이 문제인지 고견을 여쭙고 싶습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. chancehee96님!
Spring에서 선언적 트랜잭션(@Transactional)을 사용할 때 트랜잭션 롤백이 기대대로 되지 않는 경우 여러 가지 원인이 있을 수 있습니다. 다음은 일반적인 원인과 해결 방법에 대한 설명입니다:
예외 종류: 기본적으로
@Transactional은RuntimeException과 그 하위 클래스가 발생할 때에만 롤백이 수행됩니다.Exception클래스의 예외는 롤백되지 않으므로,rollbackFor = Exception.class옵션을 추가하여 명시적으로 모든 예외에 대해 롤백을 설정하셨다면 올바른 설정입니다. 그러나 SQL 예외가RuntimeException의 하위 클래스여야 롤백이 진행됩니다.트랜잭션 전파(Propagation): 사용하고 있는 트랜잭션 전파 레벨이
REQUIRED로 설정돼 있는지 확인해보세요. 기본값이긴 하지만, 경우에 따라 전파 레벨이 제대로 설정되지 않으면 이상 동작할 수 있습니다.프록시 문제: 프록시가 생성되지 않는 경우도 발생할 수 있습니다.
@Transactional이 선언된 메서드가 동일 클래스 내의 다른 메서드에 의해 호출되면 프록시가 아닌 직접 호출로 인해 트랜잭션이 적용되지 않을 수 있습니다.SQL 예외 처리: 사용 중인 DB와 JDBC 드라이버가
DataAccessException을 적절히 변환하는지 확인하세요. 일부 JDBC 드라이버는 예외 변환이 제대로 안 되어 트랜잭션 롤백이 안 될 수도 있습니다.
추가적으로 참고하실 수 있는 유사한 질문 게시물을 소개해 드립니다. 관련된 문제를 보다 포괄적으로 이해하는 데 도움이 될 것입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
스프링 배치 버전 질문
0
119
1
소스코드가 어디에 있나요?
0
95
2
질문이 있습니다.
0
128
2
ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문
0
124
2
여러 JOB 설정하는법
0
148
2
강의 자료 다른 방법 있을까요?
0
154
1
JobExecution과 JobExecutionContext와의 관계
0
185
2
특정 job만 실행
1
247
1
Batch 성능 질문
0
151
1
ItemReaderAdapter 종료
0
78
1
[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader
0
178
2
Spring Batch 배포 질문
0
245
2
spring batch 버전
0
235
2
retry count 관련 질문
0
170
2
StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.
0
327
2
jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)
0
233
2
Multithread step과 AsyncItemProcessor
0
201
2
job 재실행
0
250
2
bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)
0
182
1
Multi-threaded-step과 Partitioning 차이 확인
0
171
2
jdbcCursorReader, jdbcPagingReader 질문
0
142
1
step muti-thread 질문
0
106
1
itemSteam open update close 질문
0
109
1
@JopScope, stepScope 지연 초기화 관련 질문
1
124
1





