最终,我设法使它起作用,但是有些麻烦。这个想法是使用LockModeType.PESSIMISTIC_FORCE_INCREMENT而不是PESSIMISTIC_WRITE。使用此锁定模式,Cron作业的行为如下:
- 当第一个作业进行更新选择时,一切都会按预期进行,但是对象上的版本会更改。
- 如果在第一个作业仍在事务中时另一个作业尝试进行相同的选择,则JPA会启动OptimisticLockException,因此,如果捕获到该异常,则可以确保它被抛出读锁定。
该解决方案具有多种对应方式:
- SynchronizedCronJobTask必须具有版本字段,并且受@Version进行版本控制
- 您需要处理OptimisticLockException,并且应该在事务服务方法之外捕获它,以便在解除锁定时进行回滚。
- IMHO is a non elegant solution, much worse than simply a lock where the Cron Jobs wait for the previous Jobs to finish.



