最終的に私はそれを機能させることができましたが、いくつかの変更が加えられました。アイデアは、PESSIMISTIC_WRITEの代わりにLockModeType.PESSIMISTIC_FORCE_INCREMENTを使用することです。このロックモードを使用すると、cronジョブは次のように動作します。
- 最初のジョブで更新を選択すると、すべてが期待どおりに実行されますが、オブジェクトのバージョンが変更されます。
- 最初のジョブがまだトランザクション中にある間に別のジョブが同じ選択を行おうとすると、JPAはOptimisticLockExceptionを起動するため、その例外をキャッチした場合は、読み取りロックのためにスローされたことを確認できます。
このソリューションにはさまざまな対応物があります:
- SynchronizedCronJobTaskにはバージョンフィールドがあり、@Versionでバージョン管理されている必要があります
- OptimisticLockExceptionを処理する必要があります。ロック解除が発生したときにロールバックを行うには、トランザクションサービスメソッドの外部でキャッチする必要があります。
- IMHOは洗練されていないソリューションであり、CronJobsが前のJobsの終了を待つ単なるロックよりもはるかに悪いです。