如何处理javax.persistence.OptimisticLockException?
我是JPA的新手,如果不清楚,请原谅我 基本上,我希望通过使用乐观锁定来防止并发修改。 我已将@Version属性添加到实体类中 我需要知道这个处理OptimisticLockException的算法是否正确。 我将使用类似的方法: 我的问题是,你如何决定何时停止重试 我的问题是,你如何决定何时停止重试 在我看来,在同一时间修改同一对象是一种例外情况时,应该使用乐观锁定 现在,如果出现这种情况,并且过程是手动的,我会警告用户修改无法保存,并要求用户再次保存更改 如果流程是自动化的,那么实现自动重试机制是有意义的,但根据处理时间的不同,我不会重试超过3次或5次(我会使用递归调用来实现这一点)。如果一个自动化进程在并发访问问题上连续失败5次,那么它很可能与另一个自动化进程竞争,它们要么不处理独立的数据块(这不利于并行化),要么策略不正确。在这两种情况下,更多地重试并不是正确的解决方案如何处理javax.persistence.OptimisticLockException?,java,jpa,concurrency,ejb-3.0,eclipselink,Java,Jpa,Concurrency,Ejb 3.0,Eclipselink,我是JPA的新手,如果不清楚,请原谅我 基本上,我希望通过使用乐观锁定来防止并发修改。 我已将@Version属性添加到实体类中 我需要知道这个处理OptimisticLockException的算法是否正确。 我将使用类似的方法: 我的问题是,你如何决定何时停止重试 我的问题是,你如何决定何时停止重试 在我看来,在同一时间修改同一对象是一种例外情况时,应该使用乐观锁定 现在,如果出现这种情况,并且过程是手动的,我会警告用户修改无法保存,并要求用户再次保存更改 如果流程是自动化的,那么实现自动重
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();
}
}