Spring Batch はバッチ処理のためのフレームワークであり、トランザクション管理をサポートしています。データベース以外のファイル処理のようなシナリオでも、トランザクション管理の概念を適用できます。以下、Spring Batch におけるファイル処理のトランザクションについて、詳しく説明します。
1. トランザクション管理の仕組み
Spring Batch のトランザクション管理は、Spring の 宣言的トランザクション管理(Declarative Transaction Management) と プログラム的トランザクション管理(Programmatic Transaction Management) に基づいています。
- 宣言的トランザクション管理:
@Transactionalアノテーションや XML 設定を使用し、フレームワークが自動的にトランザクションを管理する。 - プログラム的トランザクション管理:
TransactionTemplateやPlatformTransactionManagerを使用し、手動でトランザクションを管理する。
データベース操作では PlatformTransactionManager(通常は DataSourceTransactionManager)を使用しますが、ファイル処理のようなデータベースを使用しない場合は ResourcelessTransactionManager(リソースレストランザクションマネージャー) を使用し、トランザクションの動作をシミュレートできます。
2. ACID 特性
ACID とは、トランザクションの 4 つの重要な特性 原子性(Atomicity)、一貫性(Consistency)、分離性(Isolation)、耐久性(Durability) のことです。Spring Batch におけるファイル処理のトランザクションでは、これらの特性は以下のように適用されます。
原子性(Atomicity)
一貫性(Consistency)
Stepの開始前と終了後で、データの整合性が保たれることを保証する。- 例えば、ファイル書き込みの途中でエラーが発生した場合、不完全なデータがファイルに残らないようにロールバックできる。
分離性(Isolation)
- 通常、ファイル処理は直列的に行われるため、データベースのような高度な分離レベルは必要ない。
- ただし、複数の
Stepが並行して異なるファイルを処理する場合、データの競合を防ぐ必要がある。
耐久性(Durability)
Stepが正常に完了した場合、その結果は永続化され、システムクラッシュが発生しても失われないことを保証する。- 例えば、ファイル処理後にデータをデータベースに保存する場合、一度コミットされたデータはシステム障害が発生しても保持される。
3. ロールバックの方法
データベースのトランザクションでは rollback() を呼び出すことで変更を取り消せますが、ファイル処理のトランザクションでは異なる方法でロールバックが実装されます。
ファイルの読み込み(ItemReader)
ItemReaderは通常、元のファイルを変更しないため、ロールバックの必要はない。- ただし、途中で処理が失敗した場合、Spring Batch は
JobRepositoryを利用して、次回の実行時に前回の失敗した位置から再開できる。
ファイルの書き込み(ItemWriter)
データベース操作
ItemWriterがデータベースに書き込む場合、Spring Batch は通常のデータベーストランザクションを利用してrollback()による一括取り消しを行う。
4. トランザクション分離レベル
データベースでは、一般的に READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE の 4 つの分離レベルが使用されます。Spring Batch のファイル処理においては、これらの概念は厳密には適用されませんが、次のようにシミュレートできます。
| 分離レベル | データベースの動作 | ファイル処理における対応 |
|---|---|---|
| READ UNCOMMITTED | 未コミットのデータを読み取る(ダーティリード) | 他のプロセスが書き込み中のファイルを読み取る可能性がある |
| READ COMMITTED | コミット済みデータのみを読み取る | ファイルが完全に書き込まれた後でのみ読み取れる |
| REPEATABLE READ | 1 つのトランザクション内で同じデータを読むと同じ値が取得できる | トランザクション内でファイルの内容が変更されない |
| SERIALIZABLE | すべてのトランザクションを直列実行する | ファイルの書き込みを排他制御し、並行処理を防ぐ |
Spring Batch はデフォルトで READ COMMITTED の動作に近い状態となっており、未完了の Step のデータが次の Step に影響を与えないようになっている。
5. 並行処理の制御
Spring Batch では、大量のデータを効率的に処理するために並行処理が用いられますが、次の 3 つの側面で制御が必要です。
並行読み込み(Concurrent Reading)
- 複数の
Stepが異なるファイルを並行して処理することで、スループットを向上させる。 - 例えば、
MultiResourceItemReaderを使用すると、複数のファイルを並列に読み取ることができる。
- 複数の
並行書き込み(Concurrent Writing)
ジョブの並行実行制御(Job Concurrency Control)
JobRepositoryにより、同じJobの二重実行を防ぐことができる。JobLauncherの設定でsynchronizedオプションを有効にし、ジョブを直列実行させることも可能。
まとめ
Spring Batch は、データベースを使用しないファイル処理でも ResourcelessTransactionManager や チャンク処理 を活用することで、トランザクション管理を実現できます。
初心者はまず データベースを使用した Step のトランザクション管理 を学び、それを ファイル処理や並行ジョブ に適用することで、より高度な制御が可能になります。