gpt4 book ai didi

java - 应该如何处理 javax.persistence.OptimisticLockException?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:52 26 4
gpt4 key购买 nike

我是 JPA 的新手,如果不清楚,请原谅我。

基本上我想通过使用乐观锁来防止并发修改。我已将 @Version 属性添加到我的实体类中。

我需要知道这个处理 OptimisticLockException 的算法是否合理。我要使用 Execute Around Idiom像这样:

interface UpdateUnitOfWork 
{
doUpdate( User user ); /* may throw javax.persistence.PersistenceException */
}

public boolean exec( EntityManager em, String userid, UpdateUnitOfWork work)
{
User u = em.find( User, userid );
if( u == null )
return;

try
{
work.doUpdate( u );
return true;
}
catch( OptimisticLockException ole )
{
return false;
}
}

public static void main(..) throws Exception
{
EntityManagerFactory emf = ...;
EntityManager em = null;

try
{
em = emf.createEntityManager();

UpdateUnitOfWork uow = new UpdateUnitOfWork() {
public doUpdate( User user )
{
user.setAge( 34 );
}
};

boolean success = exec( em, "petit", uow );
if( success )
return;

// retry 2nd time
success = exec( em, "petit", uow );
if( success )
return;

// retry 3rd time
success = exec( em, "petit", uow );
if( success )
return;
}
finally
{
em.close();
}
}

我的问题是您如何决定何时停止重试?

最佳答案

The question I have is how do you decide when to stop retrying ?

在我看来,同时修改同一个对象是一种异常(exception)情况,应该使用乐观锁。

现在,如果发生这种情况,并且该过程是手动的,我会警告用户修改无法保存,并要求他再次保存更改。

如果流程是自动化的,实现自动重试机制是有意义的,但我不会重试超过 3 或 5 次,具体取决于处理时间(并且我会使用递归调用来实现这个).如果一个自动化进程在并发访问问题上连续失败 5 次,那么它很可能与另一个自动化进程竞争,并且它们要么没有处理独立的数据 block (这不利于并行化),要么就是策略不正确正确的那一个。在这两种情况下,重试更多都不是正确的解决方案。

关于java - 应该如何处理 javax.persistence.OptimisticLockException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com