2012-04-18 11 views
5

शायद एक बेवकूफ सवाल है, लेकिन क्या EntityManager.merge() अपवाद फेंकने पर कैच-ब्लॉक में लेनदेन पर रोलबैक करना आवश्यक है? या अपवाद का मतलब यह है कि विलय काम नहीं करता है ताकि अगली बार जब मैं पिछले बदलावों को चलाता हूं तो अपवाद फेंक दिया गया लागू नहीं होता?कैच-ब्लॉक में लेनदेन पर रोलबैक करना आवश्यक है?

उदाहरण:

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

उत्तर

4

जवाब em.merge(person) विधि का विवरण और अपने डेटाबेस ड्राइवर के कार्यान्वयन पर निर्भर करता है।

यदि वह विधि केवल एक अपडेट स्टेटमेंट करता है, तो rollback आवश्यक है। यदि यह कई अपडेट चला सकता है, तो यह स्पष्ट नहीं है।

मैं व्यक्तिगत रूप से यह देखते रहेंगे

तो rollback निकाल दिया जाता है और अपने merge विधि त्रुटियों हमारे बाद कुछ अपडेट किया जाता है, लेकिन दूसरों को नहीं है, तो बिना स्पष्ट commit या rollback या तो प्रतिबद्ध होगा या रोलबैक डेटाबेस कनेक्शन बंद कर रहे हैं चालक कार्यान्वयन के आधार पर लेनदेन। javadoc for java.sql.Connection के अनुसार, व्यवहार कार्यान्वयन पर निर्भर करता है। इसलिए यदि आप rollback त्रुटि पर स्वयं नहीं हैं तो आप आंशिक अपडेट कर सकते हैं।

+0

लेकिन फिर आप कह सकते हैं कि कैच ब्लॉक में रोलबैक होने से कोई चोट नहीं पहुंची है? क्या मैं सही हू? – Rox

+2

@ रोक्स न केवल यह चोट पहुंचाता है, यदि आप कुछ अवांछित प्रभावों से बचना चाहते हैं तो यह आवश्यक हो सकता है। –

संबंधित मुद्दे