스프링 배치 Tasklet 트랜잭션 설정하는 방법이 궁금합니다.
- 작성자 :
- 임*혁
- 작성일 :
- 2015-11-05 10:01:14
- 조회수 :
- 4,126
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
안녕하세요.
스프링 배치로 개발을 진행하다가 트랜잭션을 풀어야 하는 경우가 생겨서 질문드립니다.
일단 현재 사용중인 프레임웍 버전은
spring : 3.2.13.RELEASE
spring batch : 3.0.5.RELEASE
maven : 4.0
quartz : 1.8.6
jdk : 1.7
입니다.
배치 구성은 하나의 Job에서 Step이 하나 있고 Tasklet을 사용했습니다.
Tasklet은 DB조회 -> 비지니스로직처리 -> DB업데이트 이렇게 구성돼있구요.
DB업데이트는 조회된 한건당 세 테이블에 업데이트를 하고 있는데 서비스의 하나의 메소드에 세 개 매퍼가 등록돼있고 Tasklet에서
해당 메소드를 호출하도록 돼있습니다.
A, B, C매퍼라고 하고 50건의 데이터를 조회하고 등록한다고 가정했을 때, 25번째 로우까지는 성공을 했고 26번째 C매퍼를 돌리다가 오류가 나면 25번째 로우까지 처리된 건들은 커밋이 되고 26번째 A, B는 롤백을 해야 하는데 롤백이 안되고 커밋이 돼버립니다.
제가 시도해본 방법으로는
1. Tasklet의 execute메소드에 @Transactional 어노테이션 처리
2. 서비스의 세 매퍼가 선언된 메소드에 @Transactional 어노테이션 처리
3. Job context가 설정돼있는 xml에서 <batch:transaction-attributes propagation="REQUIRED" />
이렇게 해봤는데 롤백이 안됩니다.
답변 부탁드립니다.
상세 소스는 첨부파일로 올립니다.
스프링 배치로 개발을 진행하다가 트랜잭션을 풀어야 하는 경우가 생겨서 질문드립니다.
일단 현재 사용중인 프레임웍 버전은
spring : 3.2.13.RELEASE
spring batch : 3.0.5.RELEASE
maven : 4.0
quartz : 1.8.6
jdk : 1.7
입니다.
배치 구성은 하나의 Job에서 Step이 하나 있고 Tasklet을 사용했습니다.
Tasklet은 DB조회 -> 비지니스로직처리 -> DB업데이트 이렇게 구성돼있구요.
DB업데이트는 조회된 한건당 세 테이블에 업데이트를 하고 있는데 서비스의 하나의 메소드에 세 개 매퍼가 등록돼있고 Tasklet에서
해당 메소드를 호출하도록 돼있습니다.
A, B, C매퍼라고 하고 50건의 데이터를 조회하고 등록한다고 가정했을 때, 25번째 로우까지는 성공을 했고 26번째 C매퍼를 돌리다가 오류가 나면 25번째 로우까지 처리된 건들은 커밋이 되고 26번째 A, B는 롤백을 해야 하는데 롤백이 안되고 커밋이 돼버립니다.
제가 시도해본 방법으로는
1. Tasklet의 execute메소드에 @Transactional 어노테이션 처리
2. 서비스의 세 매퍼가 선언된 메소드에 @Transactional 어노테이션 처리
3. Job context가 설정돼있는 xml에서 <batch:transaction-attributes propagation="REQUIRED" />
이렇게 해봤는데 롤백이 안됩니다.
답변 부탁드립니다.
상세 소스는 첨부파일로 올립니다.
A
안녕하세요. 표준프레임워크센터입니다.
현재 전체 소스가 아니라 세부적으로 분석하기 어렵지만, 현재 설정하신 내용 외에 몇가지 사항들을 한번 나열해 보겠으니 참고해보시기 바랍니다.
1. mysql을 사용하실경우 engine은 innodb로 설정되어 있어야 트랜잭션 처리가 가능합니다.
2. transaction설정 : step 태그 내에 tasklet태그에 transaction manager설정되었는지 여부, 하단링크를 확인해보시기 바랍니다.
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:brte:batch_core:step#step_configuration
위의 사항 외에 몇가지 원인이 있을 수 있으니 우선은 설정부분을 재확인 해보시기 바랍니다.
감사합니다.
현재 전체 소스가 아니라 세부적으로 분석하기 어렵지만, 현재 설정하신 내용 외에 몇가지 사항들을 한번 나열해 보겠으니 참고해보시기 바랍니다.
1. mysql을 사용하실경우 engine은 innodb로 설정되어 있어야 트랜잭션 처리가 가능합니다.
2. transaction설정 : step 태그 내에 tasklet태그에 transaction manager설정되었는지 여부, 하단링크를 확인해보시기 바랍니다.
http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:brte:batch_core:step#step_configuration
위의 사항 외에 몇가지 원인이 있을 수 있으니 우선은 설정부분을 재확인 해보시기 바랍니다.
감사합니다.