2012-04-18 42 views
5

Có lẽ một câu hỏi ngu ngốc, nhưng có cần thiết phải thực hiện một rollback trên một giao dịch trong khối catch nếu EntityManager.merge() ném một ngoại lệ? Hoặc bản thân ngoại lệ có nghĩa là hợp nhất sẽ không hoạt động để lần sau tôi chạy cam kết những thay đổi trước đó đã ném ngoại lệ sẽ không áp dụng?Có cần thiết phải thực hiện khôi phục trên giao dịch trong khối catch không?

Ví dụ:

public void setPerson(Person person) { 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyLib"); 
    EntityManager em = emf.createEntityManager(); 
    try {    
     if(!em.getTransaction().isActive()){ 
      em.getTransaction().begin(); 
     } 
     em.merge(person); 
     em.getTransaction().commit(); 
     emf.getCache().evict(Person.class); // clear Person cache 
    } catch (Exception ex){ 
     em.getTransaction().rollback(); // Is this necessary? 
    } finally { 
     em.close(); 
    } 
} 

Trả lời

4

Câu trả lời phụ thuộc vào các chi tiết của em.merge(person) phương pháp và thực hiện các trình điều khiển cơ sở dữ liệu của bạn.

Nếu phương pháp đó chỉ thực hiện một tuyên bố cập nhật, thì rollback là không cần thiết. Tuy nhiên, nếu nó có thể chạy nhiều bản cập nhật, thì nó không rõ ràng.

Cá nhân tôi sẽ giữ nó ở đó

Nếu rollback được lấy ra và merge lỗi phương pháp của bạn của chúng tôi sau khi một số thông tin cập nhật được thực hiện nhưng một số khác được không, sau đó đóng một kết nối cơ sở dữ liệu mà không rõ ràng commit hoặc rollback hoặc sẽ cam kết hoặc rollback giao dịch, tùy thuộc vào việc thực hiện trình điều khiển. Theo số javadoc for java.sql.Connection, hành vi phụ thuộc vào việc triển khai. Do đó, bạn có thể kết thúc việc cập nhật từng phần nếu bạn không tự mình làm lỗi rollback.

+0

Nhưng sau đó bạn có thể nói rằng nó không bị tổn thương để có rollback trong khối catch? Tôi có đúng không? – Rox

+2

@Rox Không chỉ nó không làm tổn thương, nó có thể là cần thiết nếu bạn muốn tránh một số hiệu ứng không mong muốn. –

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