Soy nuevo en JPA, así que discúlpeme si no lo tengo claro.¿Cómo se debe manejar una javax.persistence.OptimisticLockException?
Básicamente, quiero evitar modificaciones concurrentes mediante el bloqueo optimista. He agregado el atributo @Version a mi clase de entidad.
Necesito saber si este algoritmo sobre el manejo de OptimisticLockException es sonido. Voy a utilizar el Execute Around Idiom así:
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();
}
}
La pregunta que tengo es, ¿cómo decidir cuándo dejar de volver a intentar?