2010-12-09 7 views
18

वसंत में लेनदेन वापस रोलिंग संदर्भित Spring documentation के लिए सर्वोत्तम प्रक्रियाएं:3/हाइबरनेट

किसी भी RuntimeException रोलबैक ट्रिगर किया जाएगा, और किसी भी जाँच की अपवाद नहीं

संदर्भित जाएगा javapractices.com

अनियंत्रित अपवाद:

  • प्रोग्राम (बग) में दोषों का प्रतिनिधित्व करता है - अक्सर अमान्य तर्क गैर-निजी विधि से गुजरता है। करने के लिए जावा से बोली भाषा प्रोग्रामिंग, गोसलिंग, अर्नोल्ड, और होम्स द्वारा: "अनियंत्रित क्रम अपवाद की स्थिति है कि, आम तौर पर बोल प्रतिनिधित्व करते हैं, अपने कार्यक्रम के तर्क में त्रुटियों को प्रतिबिंबित और यथोचित रन समय से बरामद नहीं किया जा सकता । "
  • RuntimeException की उपवर्गों कर रहे हैं, और आम तौर पर IllegalArgumentException, NullPointerException, या IllegalStateException का उपयोग कर लागू किया जाता है
  • एक विधि (और वे लगभग हमेशा ऐसा नहीं करते हैं अनियंत्रित अपवाद इसके कार्यान्वयन के द्वारा फेंका के लिए एक नीति की स्थापना के लिए बाध्य नहीं है इसलिए)

जांचे हुए अपवादों:

  • तत्काल चोर बाहर के क्षेत्रों में अवैध स्थिति का प्रतिनिधित्व की trol कार्यक्रम (अमान्य उपयोगकर्ता इनपुट, डेटाबेस समस्याओं, नेटवर्क की त्रुटियों, अनुपस्थित फ़ाइलें)
  • अपवाद के उपवर्गों
  • एक विधि सभी अपवादों इसके कार्यान्वयन के द्वारा फेंका जाँच के लिए एक नीति की स्थापना करने के लिए बाध्य कर रहे हैं (या तो जाँच अपवाद आगे ढेर, मेरे व्यापार तर्क के दौरान मैं एक समस्या की खोज और मैं परिवर्तन रोलबैक करना चाहते हैं पास या यह किसी भी तरह संभाल)

, मैं एक नया भागो फेंक करने के लिए है timeException? यह वास्तव में एक रनटाइम अपवाद (अनचेक अपवाद नहीं है) क्योंकि मैंने इसे तर्क में पहचाना है। या शायद मैं इन अवधारणाओं को गलत समझ रहा हूं?

मेरा वास्तविक प्रश्न, मेरी @ ट्रांस्सेक्शन सेवा विधियों में लेनदेन को वापस लाने के लिए सबसे अच्छा अभ्यास क्या है?

उत्तर

10

आप उपयोग कर रहे हैं की तरह अपवाद आप बस उन्हें अपने @Transactional एनोटेशन के rollbackFor संपत्ति में जोड़ने के लिए जाँच की जानी चाहिए।

@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class }) 
public void method() throws MyInvalidUserException, MyApplicationException { 
    ... 
    ... 
} 

आदि

org.life.java का उत्तर भी ठीक काम करता है। यह एक अकादमिक निर्णय है यदि आप अपने घोषणात्मक लेनदेन में प्रोग्रामेटिक लेनदेन प्रबंधन को अंतःस्थापित करना चाहते हैं या इसे सख्ती से घोषणात्मक रखना चाहते हैं।

+1

अगर मैं फेंकता हूं तो मैं अपनी विधि से कुछ कैसे वापस कर सकता हूं एक अपवाद? इसके अतिरिक्त, अपवाद फेंकना काफी महंगा है। अपवाद को फायर किए बिना लेनदेन को मैन्युअल रूप से रोलबैक करने का कोई तरीका नहीं है? –

+0

@ गुइलाइमपॉलेट वन एक काउंटर्यूमपॉलेटलेट का सामना कर सकता है यदि आप जानबूझकर गैर-असाधारण व्यावसायिक प्रक्रिया प्रवाह के हिस्से के रूप में चीजों को वापस ले रहे हैं, तो आरडीबीएमएस बौने में रोलबैक से जुड़े लागत आधुनिकता पर अपवाद की वास्तविक या अनुमानित लागत के आयाम के आदेश से जेवीएम, और पूरे डिजाइन की समीक्षा की जानी चाहिए। भले ही, यदि आप घोषणात्मक लेनदेन के तरीके को पसंद नहीं करते हैं ... उनका उपयोग न करें। सुविधा का मतलब आपका एकमात्र विकल्प नहीं है। आप अभी भी सादे पुराने रोल-अपने-अपने हाइबरनेट सत्र लेन-देन का उपयोग कर सकते हैं। – Affe

4

यह

@Transactional 
public void method() throws YourCustomException { 
    try{ 
      //logic 
    }catch(Exception ex){ 
      TransactionAspectSupport.currentTransactionStatus() 
         .setRollbackOnly(); 
      throw(new YourCustomException(ex.getMessage())); 
    } 
} 
+5

... और * ऐसा क्यों होना चाहिए? – meriton

+0

@meriton यह सभी मामलों के लिए काम करेगा, मेरा मतलब है कि यह सेवा दिखाने का आपका उद्देश्य इस अपवाद को फेंक रहा है, साथ ही साथ आपकी लेनदेन की चीजों को भी ध्यान में रखा जाएगा –

2

मुझे लगता है कि यह कहना सुरक्षित है कि इस बारे में अलग-अलग राय हैं कि कौन से अपवादों की जांच की जानी चाहिए। उदाहरण के लिए, Introduction to the Spring Framework से इस अंश पर विचार करें:

स्प्रिंग डेटा का उपयोग अपवाद पदानुक्रम अनियंत्रित (क्रम) अपवाद पर आधारित है। कई परियोजनाओं पर वसंत के साथ काम करने के बाद मैं अधिक से अधिक आश्वस्त हूं कि यह सही निर्णय था।

डेटा एक्सेस अपवाद आमतौर पर पुनर्प्राप्त करने योग्य नहीं होते हैं। उदाहरण के लिए, यदि हम डेटाबेस से कनेक्ट नहीं कर सकते हैं, तो एक विशेष व्यावसायिक ऑब्जेक्ट समस्या के आसपास काम करने के लिए सक्षम होने की संभावना नहीं है। एक संभावित अपवाद आशावादी उल्लंघन लॉकिंग है, लेकिन सभी एप्लिकेशन आशावादी लॉकिंग का उपयोग नहीं करते हैं। कोड को घातक अपवादों को पकड़ने के लिए मजबूर होना मुश्किल है कि को समझदारी से संभाला नहीं जा सकता है। उन्हें शीर्ष-स्तरीय हैंडलर को सर्वलेट या ईजेबी कंटेनर की तरह प्रचारित करते हैं आमतौर पर अधिक उपयुक्त है। सभी वसंत डेटा एक्सेस अपवाद डेटाएक्सेक्स अपवाद के उप-वर्ग हैं, इसलिए यदि हम करते हैं तो सभी वसंत डेटा पहुंच अपवादों को पकड़ने का चयन करें, हम आसानी से ऐसा कर सकते हैं।

ध्यान दें कि अगर हम अनचेक डेटा एक्सेस अपवाद से पुनर्प्राप्त करना चाहते हैं, तो हम अभी भी ऐसा कर सकते हैं। हम केवल पुनर्प्राप्त करने योग्य स्थिति को संभालने के लिए कोड लिख सकते हैं। उदाहरण के लिए, यदि हम मानते हैं कि केवल एक आशावादी ताला उल्लंघन वसूली योग्य है, हम कोड एक स्प्रिंग डीएओ में के रूप में इस प्रकार लिख सकते हैं:

कोशिश {// काम करना} पकड़ (OptimisticLockingFailureException पूर्व) {//मुझे इसमें दिलचस्पी है} यदि स्प्रिंग डेटा एक्सेस अपवाद चेक किए गए थे, तो हमें कोड के बाद लिखना होगा। ध्यान दें कि हम इस वैसे भी लिखने के लिए चुन सकते हैं:

कोशिश {// कर काम} पकड़ (OptimisticLockingFailureException पूर्व) {// मैं इस में दिलचस्पी रखता हूँ} पकड़ (DataAccessException पूर्व) {// घातक; बस इसे दोबारा डालें} एक संभावित पहले उदाहरण पर आपत्ति - संकलक को संभावित रूप से पुनर्प्राप्त करने योग्य अपवाद को संभालने में लागू नहीं कर सकता - दूसरे पर भी लागू होता है। क्योंकि हमें बेस अपवाद (डेटाएक्सेक्स एक्सेप्शन) को पकड़ने के लिए मजबूर होना पड़ता है, कंपाइलर उपclass (OptimisticLockingFailureException) के लिए चेक लागू नहीं करेगा। तो संकलक हमें को एक अप्राप्य समस्या को संभालने के लिए कोड लिखने के लिए मजबूर करेगा, लेकिन में कोई सहायता प्रदान नहीं करेगा जिससे हमें पुनर्प्राप्त करने योग्य समस्या से निपटने के लिए मजबूर किया जा सके।

अनियंत्रित डेटा का उपयोग अपवादों में से वसंत का उपयोग कई की है कि के साथ संगत है - शायद सबसे - सफल हठ चौखटे। (वास्तव में, यह आंशिक रूप से जेडीओ द्वारा प्रेरित था।) जेडीबीसी चेक अपवादों का उपयोग करने के लिए कुछ डेटा एक्सेस एपीआई में से एक है। उदाहरण के लिए टॉपलिंक और जेडीओ, , अनचेक अपवाद विशेष रूप से उपयोग करें। हाइबरनेट बंद संस्करण में अनियंत्रित अपवाद की जाँच से 3.

डाटा एक्सेस अपवाद स्पष्ट रूप से कार्यक्रम के तत्काल नियंत्रण से बाहर हैं, इसलिए javapractices के अनुसार, वे जाँच की जानी चाहिए। लेकिन वसंत स्रोत के लोग अलग-अलग हैं। और मैं उनके फैसले पर जवाप्रैक्टिस से अधिक भरोसा करता हूं।

इसलिए, मुझे यह इंगित करने के लिए एक अनचाहे अपवाद फेंकने में कुछ भी गलत नहीं लगता है कि लेनदेन वापस लुढ़का जाना चाहिए। बेशक, आप चेक अपवादों का भी उपयोग कर सकते हैं, और उनके लिए रोल रोल करने के लिए पहलू को भी कॉन्फ़िगर कर सकते हैं। (विवरण के लिए Affe के जवाब देखें)

2

इस यूआरएल भर में आया हैंडलिंग & अनियंत्रित अपवाद जाँच के लिए, लेन-देन के प्रबंध: यह एनोटेशन आधारित दृष्टिकोण नहीं है, लेकिन यह अच्छी बात है।

http://javasight.wordpress.com/2009/02/17/understanding-spring-transaction-management-with-checked-and-unchecked-exceptions/

6

या तो वापस भीतर से प्रोग्राम के रूप में रोल:

@Transactional 
public void commit() { 
    try { 
    // some business logic... 
    } catch (ConstraintViolationException e) { 
    // trigger rollback programmatically 
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
    } 
} 

या रोलबैक के लिए अपवाद चिह्नित करने और फोन करने वाले से इसे संभाल:

@Transactional(rollBackFor = TransactionException.class) 
public void commit() throws ConstraintViolationException{ 
    try { 
    // some business logic... 
    } catch (ConstraintViolationException e) { 
    // handle the exception 
    // re-throw for rollback 
    new TransactionException(e); 
    } 
} 

public void doCommit(){ 
    try { 
    commit() 
    } catch (TransactionException e){ 
    // do nothing as already handled 
    } 
} 

मैं पूर्व पसंद करते हैं के रूप में यह रहता है कोड सरल है, लेकिन स्प्रिंग डॉक्स के अनुसार discouraged है:

प्रोग्रामैटिक रोलबैक उपलब्ध है, आपको इसकी पूरी आवश्यकता होनी चाहिए, लेकिन इसका उपयोग एक स्वच्छ POJO- आधारित आर्किटेक्चर प्राप्त करने के चेहरे पर उड़ता है।

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

  • कोई संबंधित समस्या नहीं^_^