2010-02-07 4 views
6

Ich bin neu bei JPA, also vergib mir, wenn ich nicht klar bin.Wie sollte man eine javax.persistence.OptimisticLockException behandeln?

Grundsätzlich möchte ich gleichzeitige Änderungen verhindern, indem Sie optimistisches Sperren verwenden. Ich habe das Attribut @Version zu meiner Entitätsklasse hinzugefügt.

Ich muss wissen, ob dieser Algorithmus bei der Handhabung von OptimisticLockException Sound ist. Ich werde die Execute Around Idiom wie so verwenden:

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(); 
    } 
} 

Die Frage, die ich habe, ist, wie Sie sich entscheiden, wenn erneut versucht zu stoppen?

Antwort

9

Die Frage, die ich habe, ist, wie entscheiden Sie, wenn Sie aufhören zu wiederholen?

Meiner Meinung nach sollte Optimistic Locking verwendet werden, wenn das Ändern desselben Objekts in der gleichen Zeit eine Ausnahmesituation ist.

Nun, wenn diese Situation auftritt, und wenn der Prozess manuell war, würde ich den Benutzer warnen, dass die Änderungen nicht gespeichert werden konnten und ihn bitten, seine Änderungen erneut zu speichern. Wenn der Prozess automatisiert ist, kann es sinnvoll sein, einen automatischen Wiederholungsmechanismus zu implementieren, aber ich würde je nach Verarbeitungszeit nicht mehr als 3 oder 5 Mal versuchen (und rekursive Aufrufe für die Implementierung verwenden) Dies). Wenn ein automatisierter Prozess fünfmal hintereinander bei einem gleichzeitigen Zugriffsproblem fehlschlägt, konkurriert er sehr wahrscheinlich mit einem anderen automatisierten Prozess und sie arbeiten entweder nicht an unabhängigen Datenblöcken (was schlecht für die Parallelisierung ist) oder die Strategie ist einfach nicht das richtige. In beiden Fällen ist der Versuch, mehr zu versuchen, nicht die richtige Lösung.