我在Hibernate中有一个持久的hibernate托管@entity Obj,其中包含字段id,fieldA和fieldB等。
在某些课程中,我有两个@Transactional方法,即updateA()和updateB() updateA()通过其id获取Obj,进行一些处理,并更新其fieldA updateB对fieldB也是如此。
我还有两个不断提出请求的客户。 一个客户端总是发出调用updateA()的请求,而另一个客户端总是调用updateB() 它们都传递了现有Obj的相同id。
有没有办法避免HibernateOptimisticLockingFailureException一直发生,或者成功处理它,因为每个方法都更新了不同的字段?某种合并?
为了完成图片,调用updateA()的线程实际上调用了类似于updateA()的其他事务方法,但没有更新fieldB。
起初我只是试图抓住异常并再次尝试操作。但有时它也会第二次失败......这似乎不是一个好的解决方案。
答案 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)