2010-08-27 7 views
6

सब कुछ मैं हाइबरनेट के बारे में पढ़ा कहा गया है कि तुम वापस एक सौदे रोल चाहिए और सत्र बंद एक त्रुटि तब होती है जब, और वहाँ आमतौर पर निम्नलिखित कोड (हाइबरनेट के डॉक्स से लिया गया) के कुछ बदलाव है एक उदाहरण के रूप में दिया:क्या होता है यदि आप हाइबरनेट में लेनदेन वापस नहीं लेते हैं?

Session sess = factory.openSession(); 
Transaction tx = null; 
try { 
    tx = sess.beginTransaction(); 
    // do some work 
    ... 
    tx.commit(); 
} catch (RuntimeException e) { 
    if (tx != null) tx.rollback(); 
    throw e; // or display error message 
} finally { 
    sess.close(); 
} 

यह पैटर्न कुछ कारणों से मेरे लिए अजीब लगता है। सबसे पहले, यह केवल एक ढांचे के लिए अनुचित रूप से जटिल लगता है जो आमतौर पर चीजों को सरल बनाने की दिशा में तैयार होता है। सबसे महत्वपूर्ण बात यह है कि क्या होता है यदि try ब्लॉक में कोड RuntimeException के अलावा कुछ और फेंकता है? ऐसा लगता है कि हाइबरनेट उस मामले में खुले लेनदेन के साथ सत्र को गहराई से बंद करने में सक्षम होना चाहिए, संभवतः इसे वापस रोल करके, लेकिन यदि यह सच है, तो rollback पर कॉल करने से परेशान क्यों हो?

+2

किसने आपको बताया कि हाइबरनेट चीजों को सरल बनाता है? :) – skaffman

उत्तर

4

हाइबरनेट कई चीजों को सरल बना सकता है, लेकिन लेन-देन प्रबंधन बहुत आसान नहीं है, इसलिए प्रत्येक लेनदेन के लिए आपको बहुत सावधानी से सोचना होगा कि आप क्या चाहते हैं। हाइबरनेट आपको इसके साथ मदद नहीं कर सकता है।

यदि try ब्लॉक में कोड RuntimeException के अलावा कुछ भी फेंकता है, तो आपका लेनदेन स्पष्ट रूप से प्रतिबद्ध नहीं है। लेकिन आप स्पष्ट रूप से रोलबैक नहीं करते हैं। sess.Close आपके finally ब्लॉक में कॉल लेन-देन रोलबैक नहीं है। क्या होता है इस पर निर्भर करता है कि यह एक घोंसला वाला लेनदेन है:

  • यदि ऐसा नहीं है, तो आखिरकार लेनदेन का समय समाप्त हो जाता है और वापस रोल हो जाता है।
  • यदि यह है, तो मूल लेनदेन यह देखेगा कि जब बच्चे स्वयं लेन-देन करता है तो वह बच्चा लेनदेन नहीं करता है। इसके परिणामस्वरूप पूरे लेनदेन का रोलबैक होगा।
0

इससे भी महत्वपूर्ण बात, क्या होता है अगर कोशिश ब्लॉक में कोड फेंकता एक RuntimeException के अलावा कुछ?

तो किसी अन्य अपवाद के अलावा RuntimeException से कोशिश ब्लॉक में कोड के ब्लॉक, एक जाँच अपवाद है, जो संकलक अपने आप में पकड़ा हो जाएगा होगा कि में संभव है, और आप को शामिल करने में खत्म होगा अपने कोड में इसका हैंडलिंग हिस्सा।

इस प्रश्न में दिए गए उदाहरण में, हम केवल RuntimeException को पकड़ रहे हैं जो मुझे लगता है कि कोड का सही तरीका है। ऐसा करके, हम लेन-देन के समय और अंततः रोलबैक के इंतजार किए बिना सीधे लेन-देन को रोलबैक कर सकते हैं। चूंकि हम रनटाइम अपवाद को फिर से फेंकना जारी रखते हैं, हम अपवाद प्रवाह को तोड़ नहीं रहे हैं। लेनदेन के रोलिंग बैक को ट्रिगर करने के लिए ट्रांजैक्शन टाइमआउट देने से लेनदेन के साथ काम करने का यह क्लीनर और स्पष्ट तरीका है।

बेशक, हमें स्पष्ट कारणों से रनटाइम अपवाद पकड़ा जा रहा है जिस तरह से हमें 'अपवाद' नहीं पकड़ना चाहिए।

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