2015-10-22 5 views
7

REQUIRED प्रचार के मामले में जब कॉलर विधि स्वयं लेनदेन करता है तो वर्तमान विधि लेनदेन गुणों को बंद कर देती है (उदाहरण के लिए रोलबैक के लिए) यदि वे अलग हैं?वसंत @ ट्रांस्सेक्शन एनोटेशन गुण प्राथमिकता/विरासत

चित्रण:

Class A { 
    @Transactional(propagation = Propagation.REQUIRED, 
     rollbackFor = { SomeException.class}) 
    void foo() { 
     try { 
      b.bar(); 
     } catch (OtherException e) { 
      // is the transaction marked as rollback-only at this point ? 
     } 
    } 
} 

Class B { 
    @Transactional(propagation = Propagation.REQUIRED, 
     rollbackFor = { OtherException.class}) 
    void bar() { 
     [...] 
    } 
} 

संपादित:

ठीक है, मैं गुंजाइश जवाब से बाहर तुच्छ से बचना चाहते हैं, तो स्पष्ट हो, I'am वसंत प्रचार से निपटने के बारे में पता था।

PROPAGATION_REQUIRED

जब प्रचार सेटिंग PROPAGATION_REQUIRED है:

आप नहीं कर रहे हैं तो नीचे दिए गए दस्तावेज के प्रासंगिक हिस्सा है, मैं सिर्फ ऊपर मेरी उदाहरण के बारे में पहले भाग स्पष्ट करना चाहते हैं , एक लॉजिकल प्रत्येक विधि के लिए लेनदेन का दायरा बनाया गया है जिस पर सेटिंग लागू है। प्रत्येक ऐसे लॉजिकल ट्रांजैक्शन स्कोप रोलबैक-केवल स्थिति को अलग-अलग लेनदेन स्कोप आंतरिक लेनदेन क्षेत्र से तार्किक रूप से स्वतंत्र होने के साथ निर्धारित कर सकता है। पाठ्यक्रम, मानक PROPAGATION_REQUIRED व्यवहार के मामले में, इन सभी स्कॉप्स को उसी भौतिक लेनदेन में मैप किया जाएगा। तो आंतरिक लेन-देन के दायरे में रोलबैक-केवल मार्कर सेट को बाहरी लेनदेन के वास्तव में प्रतिबद्ध होने का मौका प्रभावित करता है (जैसा कि आप इसे उम्मीद करेंगे)।

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

मेरा प्रश्न यह रूप में reworded जा सकता है:

तार्किक लेनदेन गुंजाइश लेनदेन गुण धारण करता है?

+0

आप उल्लेख कर सकते हैं http://stackoverflow.com/questions/ 8490852/वसंत-लेनदेन-अलगाव-प्रसार/32223597 # 32223597 एकाधिक परिदृश्यों के साथ विभिन्न प्रचार के लिए –

उत्तर

1

तो, मैंने एक परीक्षण केस स्थापित किया है, संक्षिप्त उत्तर हाँ है।

लेनदेन लॉजिकल स्कोप लेनदेन गुण रखता है और इसकी सीमाएं वास्तव में एनोटेटेड विधि हैं।

इसलिए यदि अंतर्निहित भौतिक लेनदेन दोनों विधियों के लिए समान है, तो तार्किक गुण प्रत्येक विधि के लिए उचित हैं और आंतरिक विधि बाहरी विधि लेनदेन के रोलबैक को मजबूर कर सकती है। यदि यह आखिरी ट्रिगर एक प्रतिबद्धता है, तो यह एक अप्रत्याशित रोलबैक अपवाद का कारण बन जाएगा।

सीएफ। स्प्रिंग TransactionInterceptor (टिप्पणी मेरे हैं)

try { 
     retVal = invocation.proceed(); 
} 
catch (Throwable ex) { 
     completeTransactionAfterThrowing(txInfo, ex); 
     throw ex; 
} 

completeTransactionAfterThrowing():

// txinfo is proper to the invocation target method 
if (txInfo.transactionAttribute.rollbackOn(ex)) { 
      try { 
       txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus()); 
      } 

AbstractPlatformTransactionManager.processRollback():

else if (status.isNewTransaction()) { //requiresnew 
    doRollback(status); 
} 
else if (status.hasTransaction()) { //requiered 
     [...] 
     doSetRollbackOnly(status); 
    } 
} 
+0

NOTA: यदि आप एक डीबगर का उपयोग करते हैं तो आंतरिक परिवर्तनीय स्थिति पर भरोसा न करें, स्पष्ट रूप से गेटर ट्रांज़ेक्शनएस्पेक्ट्सपोर्टपोर्टरेंटेंट ट्रांज़ेक्शनस्टैटस()। कॉलरबैक केवल() – Gab

0

spring documentation की धारा 16.5.7 का संदर्भ लें। भले ही आंतरिक विधियों को लेनदेन संदर्भ में बुलाया जाने पर आवश्यक हो, फिर भी यह उसी भौतिक लेनदेन के लिए मैप किया जाएगा।

+1

क्षमा करें लेकिन आप इसका जवाब नहीं दे रहे हैं सवाल। – Gab

0

विनिर्देशों की मेरी समझ में, मैं इस उदाहरण में कहेंगे:

Class A { 
    @Transactional(propagation = Propagation.REQUIRED, 
     rollbackFor = { SomeException.class}) 
    void foo() { 
     try { 
      b.bar(); 
     } catch (OtherException e) { 
      // the transaction is marked as rollback-only by the inner call as it thrown an OtherException 
      // XXX --- or not if inner logical scope does not handle overridden property 'rollbackFor' ? --- 
      // anyway, we avoid UnexpectedRollbackException by enforcing physical rollback to outter scope programmatically, by throwing : 
      throw new SomeExeption(e); 
     } 
    } 
} 

Class B { 
    @Transactional(propagation = Propagation.REQUIRED, 
     rollbackFor = { OtherException.class}) 
    void bar() { 
     [...] 
    } 
} 

तो हम के रूप में प्रश्न reformulate कर सकते हैं: करता अधिरोहित "rollbackFor" संपत्ति भीतरी तार्किक लेनदेन गुंजाइश प्रबंधन द्वारा नियंत्रित किया जाता?

वैसे, आप किस लेनदेन प्रबंधक वर्ग और संस्करण का उपयोग करते हैं?

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