使用JPA和Hibernate重试乐观锁定异常

RNJ*_*RNJ 5 java spring hibernate jpa transactions

我在hibernate中遇到了一些脏写问题.我添加了@version字段,以便我可以看到我是否正在写一个过时的表.这意味着我现在有很多锅炉板代码

try {
   tryWriteToTable();
} catch (PersistenceExcepton) {  //subclasss of OptimisiticLockException
   try {
      tryWriteToTable();
   } catch (PersistenceExcepton) {
       //dont try again - something seriously wrong
   }
}  
Run Code Online (Sandbox Code Playgroud)

我正在使用Spring,并想知道是否有任何东西可以让我定义这个模式.如果有异常,可以让我重复的东西.除了Spring之外,我还可以使用其他任何东西来避免所有这些丑陋的锅炉板代码.

我想要这样的东西

@TryTwice
private void tryWriteToTable() ....
Run Code Online (Sandbox Code Playgroud)

谢谢

Vla*_*cea 10

实现目标的最佳方法是使用拦截器来捕获OptimisticLockingException并允许您重试操作。

但是,请注意,这仅在您获取最新的实体快照并在没有旧版本属性的情况下复制分离状态时才有效。像这样的策略很容易丢失更新。

因此,仅当您尝试保存的实体属性子集只能由您自己的进程而不是任何其他并发事务更新时,才应使用重试策略。

为了简化任务,我创建了db-util开源项目,它也可以在 Maven Central 上获得。它基于 Spring AOP,它提供了一个@Retry注解来标记您希望在获得乐观锁定异常时重试的服务。