如何在Spring事务中处理Hibernate OptimisticLockException?

时间:2019-05-25 20:20:35

标签: spring hibernate transactions spring-data-jpa race-condition

在我的系统中,我正在处理数据库中的并发更新问题。关于系统的一点点。 Spring Job正在执行一些数据库操作。此时,其他一些服务将更新数据库。因此,为防止这种情况,我使用了Hibernate版本控制。我写了下面的代码

try {
  dao.save(entityToSaveDB);
} catch (OptimisticLockException e) {
  logger.info(":(");
   entityManager.flush();
   entityManager.clear();
  // If the version mismatch Hibernate will throw exception.
  // And catch in this block. Resolved the mismatch and save that.
  updatedEntity = resolvedAndSyncWithDB(entityToSaveDB);
  dao.save(updatedEntity);    
}

对于DAO层,我正在使用Spring-data-jpa

如果Hibernate在数据库中找到一个已经更新的版本,则会抛出乐观锁定异常。然后在catch块中从数据库中检索该数据,将其解析并更新回DB。

上面提到的代码已放在Spring Batch Job中。作业的Step默认为Transactional。因此,当OptimisticLockException抛出时,它标志着整个事务rollbackOnly

我试图使用另一个事务,但是Spring不允许这样做。

所以我的问题是如何在Spring事务中处理这种休眠版本控制以及处理此问题的最佳实践是什么?

0 个答案:

没有答案