2017-05-30 533 views
1

我有两个不同的计划cron作业,每15分钟运行一次并在60秒内完成作业。在同一enity两种行为:看了那么进程,然后使用JpaRepository保存方法保存entitiy并导致以下错误如何避免造成ObjectOptimisticLockingFailureException的两个计划作业的冲突

org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [nl.coin.comp.domain.ServiceProvider] with identifier [105]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [nl.coin.comp.domain.ServiceProvider#105] 

作为修复我想避免两个作业之间的冲突。我正在考虑对两者使用@Scheduled(fixedelay)不同的固定延迟,但它们也可以重叠。 请帮我这个。

+0

再试一次?这就是您通常在乐观锁定失败时执行的操作。 – Kayaman

+0

感谢您的答复,但我不想重试,因为我的应用程序将运行在不同的节点上,并具有相同的分贝,所以如果1节点的工作做的任务,我很好这个异常但在同一个应用程序实例我想避免两个工作之间的冲突。 – Laxmikant

回答

0

尝试使用悲观锁。在实体的交易中添加select for update。第二个应该等到交易1结束。

+0

感谢您的回复。应用悲观锁定会阻止应用程序的其他部分读取同一行。我正在考虑在两个job之间使用带有共享锁的应用程序级同步块。如果作业已获得锁,则其他人将等待。唯一的缺点是我看到两个工作不会同时运行,并且会等待util完成。 – Laxmikant

+0

这是一个潜在的泄漏。假设你在不同的节点上运行2个作业。我还建议为实体介绍一种状态。开始工作后立即将其设置为“进行中”,并让其他作业等待,直到状态被释放。 – StanislavL