본문 바로가기
spring/spring batch

[Spring Batch] org.springframework.dao.EmptyResultDataAccessException: Item 0 of 3 did not update any rows

by moonsiri 2021. 11. 18.
728x90
반응형

Spring Batch 실행 시 아래와 같은 오류가 발생했습니다.

org.springframework.dao.EmptyResultDataAccessException: Item 0 of 3 did not update any rows: [...]
    at org.mybatis.spring.batch.MyBatisBatchItemWriter.write(MyBatisBatchItemWriter.java:161)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.writeItems(SimpleChunkProcessor.java:193)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.doWrite(SimpleChunkProcessor.java:159)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.write(SimpleChunkProcessor.java:294)
    at org.springframework.batch.core.step.item.SimpleChunkProcessor.process(SimpleChunkProcessor.java:217)
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:77)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:407)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:331)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)

 

원인은 MyBatisBatchItemWriter의 assertUpdates 때문이었습니다.

assertUpdates는 적어도 하나의 항목이 행을 업데이트하거나 삭제하지 않을 경우 예외를 throw 할지 여부를 설정하는 것인데, 기본값이 true입니다. (기본 값이 true일 때 발생하는 예외가 EmptyResultDataAccessException)

그런데 제가 실행한 ItemWriter는 행을 업데이트하거나 삭제하지 않을 수도 있는 작업이었기 때문에 예외가 발생한것이죠.

assertUpdates의 값을 false로 설정하여 해결하였습니다.

 

	public MyBatisBatchItemWriter<...> deleteData() {
		return new MyBatisBatchItemWriterBuilder<...>()
			.sqlSessionFactory(getSqlSessionFactory())
			.assertUpdates(false)	//
			.statementId(statementId)
			.build();
	}

 

 

 

728x90
반응형

댓글