@Autowired
private JobRepositoryTestUtils jobRepositoryTestUtils;
@AfterEach
void tearDown() {
jobRepositoryTestUtils.removeJobExecutions();
}
헌데, 이게 작동하지 않는 경우가 있는데 그것은, JDBC Connection Pool 에서 autoCommit=false
로 설정했을 때이다.
이 경우 저 메소드가 삭제하는 테이블들이 제대로 삭제가 안되고 롤백이 돼 버리는데, 이유는 removeJobExecutions()
메소드 내부에서 호출하는 메소드들에 제대로 된 트랜잭션이 안 걸려 있기 때문이다.
1차 시도 : tearDown()
에 @Transactional
설정 : 실패.
2차 시도 : autoCommit=true
이건 당연히 작동한다. 하지만 내가 원하는건 false
Spring Batch 용 Datasource 와 애플리케이션 데이터소스를 분리하고 애플리케이션 데이터소스는 autoCommit=false
, batch 데이터소스는 autoCommit=true
로 하는 것이 좋다.
3차 시도 : 강제 트랜잭션주기. 성공
@Autowired
private JobRepositoryTestUtils jobRepositoryTestUtils;
@Autowired
private PlatformTransactionManager platformTransactionManager;
/**
* {@link JobRepositoryTestUtils#removeJobExecutions()} 내부에 transaction이 없는데 ''autoCommit=false'' 설정때문에
* 이 메소드 내부의 update 쿼리가 rollback 되는 현상이 발생해서 강제로 트랜잭션을 설정해준다.
*/
@AfterEach
void tearDown() {
TransactionTemplate transactionTemplate = new TransactionTemplate(platformTransactionManager);
transactionTemplate.afterPropertiesSet();
transactionTemplate.execute(status -> {
jobRepositoryTestUtils.removeJobExecutions();
return null;
});
}