有没有办法避免HibernateOptimisticLockingFailureException?

时间:2014-09-29 04:32:30

标签: java database hibernate jpa optimistic-locking

我在Hibernate中有一个持久的hibernate托管@entity Obj,其中包含字段id,fieldA和fieldB等。

在某些课程中,我有两个@Transactional方法,即updateA()和updateB() updateA()通过其id获取Obj,进行一些处理,并更新其fieldA updateB对fieldB也是如此。

我还有两个不断提出请求的客户。 一个客户端总是发出调用updateA()的请求,而另一个客户端总是调用updateB() 它们都传递了现有Obj的相同id。

有没有办法避免HibernateOptimisticLockingFailureException一直发生,或者成功处理它,因为每个方法都更新了不同的字段?某种合并?

为了完成图片,调用updateA()的线程实际上调用了类似于updateA()的其他事务方法,但没有更新fieldB。

起初我只是试图抓住异常并再次尝试操作。但有时它也会第二次失败......这似乎不是一个好的解决方案。

2 个答案:

答案 0 :(得分:2)

如果你能安全地做到这一点,最简单的方法是从乐观锁定中排除fieldB

import org.hibernate.annotations.OptimisticLock;

/* ... */

@OptimisticLock(excluded=true)
private B fieldB;

答案 1 :(得分:2)

您可以使用automatic optimistic locking retry mechanism

为此,您需要添加以下依赖项:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>db-util</artifactId>
    <version>0.0.1</version>
</dependency>

然后使用以下注释标记您的服务方法:

@Retry(times = 5, on = OptimisticLockException.class)