ロールバックの制御

デフォルトでは、再試行またはスキップに関係なく、ItemWriter から例外がスローされると、Step によって制御されるトランザクションがロールバックされます。前述のようにスキップが構成されている場合、ItemReader から例外がスローされてもロールバックは発生しません。ただし、トランザクションを無効にするアクションが実行されていないため、ItemWriter からスローされた例外によってロールバックが発生しないシナリオが多数あります。このため、ロールバックを引き起こしてはならない例外のリストを使用して Step を構成できます。

  • Java

  • XML

Java では、次のようにロールバックを制御できます。

Java 構成
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(2, transactionManager)
				.reader(itemReader())
				.writer(itemWriter())
				.faultTolerant()
				.noRollback(ValidationException.class)
				.build();
}

XML では、次のようにロールバックを制御できます。

XML 構成
<step id="step1">
   <tasklet>
      <chunk reader="itemReader" writer="itemWriter" commit-interval="2"/>
      <no-rollback-exception-classes>
         <include class="org.springframework.batch.item.validator.ValidationException"/>
      </no-rollback-exception-classes>
   </tasklet>
</step>

トランザクションリーダー

ItemReader の基本契約は、フォワードのみです。このステップはリーダーの入力をバッファリングするため、ロールバックの場合にアイテムをリーダーから再度読み取る必要はありません。ただし、リーダーが JMS キューなどのトランザクションリソース上に構築される特定のシナリオがあります。この場合、キューはロールバックされるトランザクションに結び付けられているため、キューからプルされたメッセージは戻されます。このため、アイテムをバッファリングしないようにステップを構成できます。

  • Java

  • XML

次の例は、Java でアイテムをバッファリングしないリーダーを作成する方法を示しています。

Java 構成
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(2, transactionManager)
				.reader(itemReader())
				.writer(itemWriter())
				.readerIsTransactionalQueue()
				.build();
}

次の例は、XML でアイテムをバッファリングしないリーダーを作成する方法を示しています。

XML 構成
<step id="step1">
    <tasklet>
        <chunk reader="itemReader" writer="itemWriter" commit-interval="2"
               is-reader-transactional-queue="true"/>
    </tasklet>
</step>