Comment doit-on gérer un javax.la persistance.OptimisticLockException?
Je suis nouveau sur JPA donc pardonnez-moi si ne pas être clair.
Fondamentalement, je veux éviter les modifications concurrentes en utilisant le Verrouillage Optimiste.
J'ai ajouté le @Version attribut de ma classe d'entité.
J'ai besoin de savoir si cet algorithme sur la manipulation OptimisticLockException est son.
Je vais utiliser le Exécutez Autour De L'Idiome comme suit:
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 question que je me pose est de savoir comment vous décider d'arrêter de réessayer ?
Vous devez vous connecter pour publier un commentaire.
À mon avis, le Verrouillage Optimiste doit être utilisé lors de la modification de l'objet même dans le même temps, c'est une situation exceptionnelle.
Maintenant, si cette situation se produit, et si le processus est manuel, je voudrais signaler à l'utilisateur que les modifications ne pouvait pas être sauvé et lui demander de sauver sa change de nouveau.
Si le processus est automatisé, il peut être judicieux de mettre en œuvre une relance automatique mécanisme, mais je ne voudrais pas réessayer plus que quelque chose comme 3 ou 5 fois, en fonction du temps de traitement (et je préfère utiliser les appels récursifs pour mettre en œuvre cette). Si un processus automatisé d'échec de 5 fois d'affilée sur un accès simultané de problème, il est très probablement en compétition avec un autre processus automatisé et ils ne sont pas au travail indépendant des blocs de données (ce qui est mauvais pour la parallélisation) ou la stratégie est tout simplement pas la bonne. Dans les deux cas, une nouvelle tentative plus n'est pas la bonne solution.