2013-02-27 36 views
12

स्प्रिंग जावाडोक @Transactional(propagation = Propagation.SUPPORTS)स्प्रिंग @ ट्रान्सैक्शनल (प्रचार = प्रचार। सपोर्ट्स) का उपयोग कब करें?

समर्थन एक वर्तमान लेन-देन के अनुसार, अमल गैर transactionally अगर कोई मौजूद है। एक ही नाम के ईजेबी लेनदेन विशेषता के अनुरूप।

ऐसा लगता है कि मैं केवल विधियों को गैर लेनदेन की घोषणा कर सकता हूं और इसके साथ ही किया जा सकता हूं इसलिए मेरे प्रश्न हैं।

  • कुछ स्थितियां कहां हैं जहां प्रचार प्रचार की आवश्यकता है?
  • समर्थन प्रचार का बिंदु क्या है?

क्या कोई वास्तविक दुनिया का उदाहरण/परिदृश्य दे सकता है जहां सपोर्ट वास्तव में उपयोगी थे?

+0

हेवा इस उत्तर पर एक नज़र डालें: http: // stackoverflow।कॉम/प्रश्न/6437828/वसंत-लेन-देन-समर्थन-प्रसार-प्रसार # 6437 9 24 – GKislin

उत्तर

5

सबसे आसान उदाहरण मैं सोच सकता हूं कि एक विधि एक जेएमएस सर्वर को कुछ सामग्री भेजती है। यदि आप किसी लेनदेन के संदर्भ में हैं, तो आप संदेश को लेनदेन के दायरे के साथ जोड़ना चाहते हैं। लेकिन अगर पहले से ही कोई लेनदेन नहीं चल रहा है, तो लेनदेन सर्वर को फोन करने और एक-एक संदेश भेजने के लिए क्यों शुरू करना है?

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

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

+0

जेएमएस उदाहरण में आप देते हैं, यदि कोई टीएक्स नहीं है लेकिन jms सत्र/निर्माता साझा किया जाता है तो यह संदेश TX के हिस्से के रूप में भेजा जाता है। मुझे लगता है कि एक वितरित टीएक्स एकमात्र ऐसा स्थान है जहां सपोर्ट उपयोगी हो सकते हैं। – ams

+0

मुझे लगता है कि यदि आप NOT_SUPPORTED के उदाहरण हैं और अंतर करना चाहते हैं तो यह एक एपीआई मार्कर के रूप में एक गैर-वितरित सेटिंग में अभी भी उपयोगी हो सकता है। लेकिन आप सही हैं कि कार्यान्वयन के अनुसार यह टीएक्स वितरित नहीं होने पर बिल्कुल कुछ भी नहीं डालने से वास्तव में बहुत अलग नहीं है। – Affe

3

यह एक का चयन आपरेशन पर readOnly=true लेन-देन संबंधी ध्वज के साथ एक अच्छी जोड़ी विशेष रूप से जब ORM प्रयोग किया जाता है बनाता है:

@Transactional(readOnly = true, propagation=Propagation.SUPPORTS) 
public Pojo findPojo(long pojoId) throws Exception { 
    return em.find(Pojo.class, pojoId); 
} 

इस मामले में आप एक नई लेन-देन करता है, तो बनाने की कीमत के भुगतान नहीं सुनिश्चित करें कि एक चुनिंदा ऑपरेशन करने के लिए पहले से ही एक नहीं है।

हालांकि अगर आपको लगता है कि विचार प्रक्रिया में किया गया है पहले से ही आप भी लेन-देन संबंधी पहलू सब एक साथ खाई पर विचार हो सकता:

public Pojo findPojo(long pojoId) throws Exception { 
    return em.find(Pojo.class, pojoId); 
} 
+0

तो ... क्या यह वास्तव में एक ओआरएम ढांचे (जैसे MyBatis) के माध्यम से स्थानीय डेटाबेस में चयन करने के लिए @Transactional एनोटेशन डालने के लायक है? – aloplop85

+0

"ट्रांजेक्शनल पहलू को हटा दें", क्या यह @NotTransactional का उपयोग करने जैसा ही है? –

+0

अगर किसी के पास कोई लेनदेन पहलू नहीं है, या @NotTransactional है, और इसे लेनदेन के भीतर से बुलाया जाता है, तो क्या होता है? जैसे यदि लेनदेन विधि ए डीबी को कुछ लिखता है, तो नोटट्रांसैक्शनल विधि को कॉल करता है, जो कुछ भी लिखता है, फिर ईटर ए या बी एक अनचेक अपवाद फेंक देता है, जो वापस लुढ़का जाता है? –

0

अनुसार इस मुद्दों Improve performance with Propagation.SUPPORTS for readOnly operation आप Propagation.SUPPORTS साथ केवल पढ़ने के लिए लेन-देन सेट नहीं करना चाहिए:

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

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