在我的系统中,我正在处理数据库中的并发更新问题。关于系统的一点点。 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事务中处理这种休眠版本控制以及处理此问题的最佳实践是什么?