当前位置: 首页 > 知识库问答 >
问题:

有没有使用Hibernate/Spring Data JPA进行乐观锁定的通用方法?

阎京
2023-03-14
  1. 打开事务(使用@transactional)
  2. 选择需要更改的实体
  3. 检查是否可以进行所需的更改(验证步骤)
  4. 执行更改
  5. 保存一切(Spring Data JPA repository save()方法),提交事务
  6. 如果捕获到任何OptimisticLockException,则必须从步骤1开始重试所有操作(直到成功保存或验证步骤失败,且不超过X次)

对于任何类型的乐观锁定处理,这种算法看起来都很常见。是否有一种通用的方法使用hibernate或spring data jpa来执行这些重试/处理乐观锁定失败,或者我应该自己编写这样的方法?我的意思是(但不是字面意思):

boolean trySaveUntilDoneOrNotOptimisticLockingExceptionOccur(Runnable codeWhichSelectsValidatesUpdatesAndSavesDataButWithoutOptimisticLockingProcessing, int maxOptimisticLockingRetries)

共有1个答案

燕凯旋
2023-03-14

由于问题带有spring-data-jpa标记,我将从Spring World中回答。

只需查看@retryable。我发现它对于您描述的完全相同的用例非常有用。这是我的一贯模式:

@Service
@Transactional
@Retryable(maxAttempts = 7, 
            backoff = @Backoff(delay = 50), 
            include = { TransientDataAccessException.class,
                        RecoverableDataAccessException.class }
)
public class MyService {

    // all methods in this service are now transactional and automatically retried.

}

当然,你可以使用退避选项。

 类似资料:
  • 我试图在不同的事务中更新同一行,以理解Hibernate的乐观锁定。 但是我没有得到任何StaleObjectStateException或任何其他异常。 我已经在我正在尝试执行的操作上方附加了代码。请让我知道..我错过了什么吗? 或者乐观锁定与我正在尝试做的事情不同。 在上面的代码中,我启动了两个线程“早些时候”和“晚些时候”,它们都从会话工厂获取会话对象,并从数据库加载相同的记录并同时更新它。

  • 我有一个这样的实体: 我有一个生成HQL的代码: 执行更新的代码: 问题: 乐观锁在这里出现吗?在上述情况下,Hibernate是否会自动处理乐观锁定(运行HQL且没有会话)? 如果上述情况不正确,我需要自己实现:我阅读了Hibernate文档,其中说,我需要用注释一个字段。但是我应该专门为此在表中添加这个新字段吗?或者我可以为注释指定任何现有字段?这里有什么特殊处理吗? 在乐观锁定期间抛出的异常

  • 我正在使用100个实体(使用JHipster)设置一个新的Spring Boot API,我的问题是:鉴于我有一组存储库层方法,我希望我的所有存储库都能够调用这些方法。 我已经尝试制作所有接口来扩展('RepositoryQuery'是我默认的自定义接口名称后缀),然后使用特定于实体的类。请注意,所有的类扩展了一个泛型实现类,名为。 请注意,给定正则表达式中的“.*”代表我的持久实体集中的任何实体

  • 我读到我们可以使用<code>@version</code>在hibernate中使用version字段实现乐观锁定。然后,通过阅读悲观锁定,我知道了<code>org.hidbernate。LockMode</code>类,它有一些选项,如<code>LockMod。我们可以在中指定的OPTIMISTICetc。 所以我的问题是我是否需要同时使用和?

  • 我有一个带有和的微服务。我使用注释对中的表执行操作。我遇到的问题是保存操作花费了太多的时间,所以我希望读取操作不被它阻塞。注意,保存是通过持久化实体来执行的。 当前,在所有并发保存操作完成之前,所有读取操作都不会返回结果,这意味着表被锁定。相反,我希望实现乐观锁定。我怎样才能做到呢?

  • 问题内容: 我对Hibernate和Spring完全陌生,在尝试学习Spring,Hibernate,Maven等时,我只知道如何使用这三个方法来运行helloworld示例。根据我的基本理解,我被分配了执行乐观锁定的任务。就我用谷歌搜索,我只能看到它不是很困难,我所需要的只是在我的xml中添加一个版本标签,并在我的映射类中添加整数变量版本。 我的xml应该是这样的 当第二个用户保存时,hiber