2011-04-05 13 views
8

मैं वसंत एओपी के लिए एनोटेशन आधारित घोषणात्मक दृष्टिकोण का उपयोग कर रहा हूं। नमूना कोडलेनदेन का प्रचार व्यवहार

ClassA{ 
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) 
add() 
{ 
method1(); 
method2(); 
method3(); 

} 
} 

लेकिन मैं अभी भी propagation.does के उपयोग पर शक है propagation.Requires_New अर्थ है कि प्रत्येक अनुरोध नई लेन-देन शुरू कर देंगे।

दूसरा सवाल:

Method2 की तरह किसी भी विधि की विफलता, method3 लेनदेन रोलबैक का कारण होगा करता है?

यदि कोई लेनदेन प्रसार को किराए पर लेने में मेरी मदद कर सकता है तो मैं बहुत खुश हूं।

कोई मुझे वास्तविक दुनिया का उदाहरण प्रदान कर सकता है जहां हमें मौजूदा लेनदेन में भाग लेने की आवश्यकता है। क्योंकि मैं कल्पना करता हूं कि उपरोक्त उदाहरण में हम जो फ़ंक्शन जोड़ रहे हैं, वह सभी उपयोगकर्ताओं के लिए स्वतंत्र होगा, या कोई अन्य फ़ंक्शन प्रत्येक के लिए स्वतंत्र होगा उपयोगकर्ता जो कॉल कर रहा है। मैं उदाहरण नहीं ढूंढ पा रहा हूं जहां अन्य प्रचार व्यवहार जैसे PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW इत्यादि का उपयोग

उत्तर

31

इस टिप्पणी का उत्तर देना, न कि वास्तविक प्रश्न: - विष 3 घंटे पहले

न तो

लेनदेन सत्र विशिष्ट या अनुरोध विशिष्ट हैं। अनुरोध और सत्र दोनों वेब-विशिष्ट स्कोप हैं, जबकि वसंत लेनदेन अमूर्तता के पास वेब प्रौद्योगिकियों के साथ कुछ लेना देना नहीं है।

@Transactional का दायरा प्रति विधि आमंत्रण है, क्योंकि @Transactional स्प्रिंग एओपी के माध्यम से लागू किया गया है। लेन-देन की स्थिति ThreadLocal चर में रखी जाती है जो प्रारंभिक @Transactional विधि दर्ज की जाती है और इसे छोड़ने पर प्रतिबद्ध या रोलबैक के साथ साफ़ किया जाता है। यह संपूर्ण अमूर्त जावा विधि स्तर पर काम करता है, और इसलिए किसी वेब कंटेनर से इसकी आवश्यकता या लाभ नहीं होता है।


और नीचे टिप्पणी में इस प्रश्न के जवाब में:

धन्यवाद @ शॉन, मैं stil जवाब मिल नहीं पा रहा हूँ, जहां अन्य प्रचार व्यवहार PROPAGATION_SUPPORTS , PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW की तरह आदि का उपयोग किया जाता है। पूरे प्रश्न

के लिए ऊपर देखें यहाँ मेरी टिप्पणी के साथ Propagation मानों की सूची है:

अनिवार्य
समर्थन एक वर्तमान लेन-देन, अगर कोई भी मौजूद है एक अपवाद फेंक देते हैं।

एक नई लेन-देन शुरू नहीं होता, बस जांच करता है कि एक सौदे सक्रिय है

नेस्ट
एक नेस्टेड भीतर निष्पादित (या तो एक और @Transactional विधि कॉल या एक प्रोग्राम के रूप में बनाई गई लेन-देन के अंदर होना चाहिए) लेनदेन यदि वर्तमान लेनदेन मौजूद है, तो PROPAGATION_REQUIRED जैसा व्यवहार करें।

लेनदेन मौजूद होने पर घोंसला लेनदेन शुरू करें, अन्यथा एक नया लेनदेन शुरू करें।

कभी
, निष्पादित गैर transactionally अगर एक सौदे मौजूद है एक अपवाद फेंक देते हैं।

लेनदेन शुरू नहीं करता है। यदि लेनदेन मौजूद है तो विफल रहता है।

NOT_SUPPORTED
, निष्पादित गैर transactionally अगर एक मौजूद वर्तमान लेन-देन रोक देते हैं।

लेनदेन शुरू नहीं करता है। किसी भी मौजूदा लेनदेन को निलंबित करता है।

आवश्यक
समर्थन एक वर्तमान लेन-देन, एक नया बना है, तो कोई भी मौजूद है।

यदि कोई लेनदेन मौजूद है, तो इसका उपयोग करें, यदि नहीं, तो एक नया बनाएं। 95% मामलों में, आपको यही चाहिए।

REQUIRES_NEW
एक नई लेन-देन बनाएं, अगर एक मौजूद वर्तमान लेन-देन रोक देते हैं।

हमेशा एक नया लेनदेन बनाता है, भले ही कोई मौजूदा लेनदेन मौजूद न हो। यदि ऐसा है, तो इस विधि निष्पादन की अवधि के लिए इसे निलंबित कर दिया जाएगा।

का समर्थन करता है
समर्थन एक वर्तमान लेन-देन पर अमल गैर transactionally कोई भी मौजूद नहीं है।

एक सौदे अगर एक मौजूद है (और या तो एक नया शुरू नहीं होगा) का उपयोग कर सकते हैं, लेकिन एक की जरूरत नहीं है


ज्यादातर मामलों में, REQUIRED क्या आप इसलिए जरूरत है (है यह @Transactional एनोटेशन में डिफ़ॉल्ट है)। मैंने व्यक्तिगत रूप से किसी अन्य मूल्य को कभी नहीं देखा है लेकिन REQUIRED और REQUIRES_NEW उपयोग में है।

+0

धन्यवाद @ सीन, मैं उत्तर पाने में सक्षम नहीं हूं जहां PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW आदि जैसे अन्य प्रचार व्यवहार का उपयोग किया जाता है। कृपया पूरे प्रश्न – Vish

+0

धन्यवाद @ Sean.so यदि एकाधिक अनुरोध एक ही विधि का आह्वान कर रहे हैं तो एडीडी(), आवश्यक एनोटेशन उन्हें उसी लेनदेन में चलाने के लिए तैयार करेगा? लेकिन मुझे लगता है कि सभी जोड़ें() विधि आमंत्रण लेन-देन की अवधि में एक दूसरे के लिए स्वतंत्र रहें .. अभी भी भ्रम का थोड़ा सा है – Vish

+1

@ विश नो, कभी नहीं। एक नया अनुरोध हमेशा एक नए धागे में एक नया विधि आमंत्रण का मतलब है और इसलिए एक नया लेनदेन। यह सभी लेनदेन सामग्री एक विधि के आवेषण के भीतर होती है, बाहरीतम एक। यह मुश्किल हो जाता है जब बाहरी विधि आंतरिक लेनदेन विधि कहती है, लेकिन बाहरी विधि को दो बार कॉल करने का अर्थ है दो लेनदेन, चाहे वह किसी वेब संदर्भ में है या नहीं। –

0

हां है। Requires_New का अर्थ है कि प्रत्येक अनुरोध नए लेनदेन शुरू करेगा। और विधि 2 में हां विफलता, method3 रोलबैक गुणों के आधार पर लेनदेन को रोलबैक का कारण बन जाएगी। Transactional गुणों की जांच करें।

+0

लेनदेन सत्र विशिष्ट हैं या अनुरोध विशिष्ट – Vish

1

लेनदेन प्रचार इंगित करता है कि दिए जाने पर दिए गए तरीके का व्यवहार क्या होना चाहिए। REQUIRES_NEW का मतलब है कि एक नया लेनदेन हमेशा शुरू किया जाना चाहिए, भले ही कोई चल रहा लेनदेन हो।

यदि method1(), उदाहरण के लिए, REQUIRES_NEW को परिभाषित करता है, यह एक नए लेनदेन में निष्पादित होगा।

एक अपवाद वर्तमान सक्रिय लेनदेन को रोलबैक करेगा, हां।

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