2010-02-07 32 views
6

Tôi mới tham gia JPA nên tha thứ cho tôi nếu không rõ ràng.Làm cách nào để xử lý một javax.persistence.OptimisticLockException?

Về cơ bản, tôi muốn ngăn việc sửa đổi đồng thời bằng cách sử dụng Khóa lạc quan. Tôi đã thêm thuộc tính @Version vào lớp thực thể của mình.

Tôi cần biết liệu thuật toán này có đang xử lý OptimisticLockException không. Tôi sẽ sử dụng Execute Around Idiom như vậy:

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

Các câu hỏi tôi có là làm thế nào để bạn quyết định khi nào phải ngừng thử lại?

Trả lời

9

Câu hỏi tôi có là làm cách nào để bạn quyết định thời điểm ngừng thử lại?

Theo ý kiến ​​của tôi, Khóa lạc quan nên được sử dụng khi sửa đổi cùng một đối tượng trong cùng một thời điểm là một tình huống đặc biệt.

Bây giờ, nếu tình huống này xảy ra, và nếu quá trình này là thủ công, tôi sẽ cảnh báo người dùng rằng các sửa đổi không thể được lưu và yêu cầu anh ta lưu các thay đổi của mình một lần nữa. Nếu quá trình này được tự động, nó có thể có ý nghĩa để thực hiện một cơ chế thử lại tự động nhưng tôi sẽ không thử lại nhiều hơn 3 hoặc 5 lần, tùy thuộc vào thời gian xử lý (và tôi sẽ sử dụng các cuộc gọi đệ quy để thực hiện). điều này). Nếu một quá trình tự động thất bại 5 lần liên tiếp trên một vấn đề truy cập đồng thời, thì rất có khả năng cạnh tranh với một quy trình tự động khác và chúng không hoạt động trên các khối dữ liệu độc lập (điều này là không hợp lý) hoặc chiến lược cái đúng. Trong cả hai trường hợp, thử lại nhiều hơn không phải là giải pháp đúng.

Các vấn đề liên quan