लेनदेन सत्र विशिष्ट या अनुरोध विशिष्ट हैं। अनुरोध और सत्र दोनों वेब-विशिष्ट स्कोप हैं, जबकि वसंत लेनदेन अमूर्तता के पास वेब प्रौद्योगिकियों के साथ कुछ लेना देना नहीं है।
@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
उपयोग में है।
धन्यवाद @ सीन, मैं उत्तर पाने में सक्षम नहीं हूं जहां PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW आदि जैसे अन्य प्रचार व्यवहार का उपयोग किया जाता है। कृपया पूरे प्रश्न – Vish
धन्यवाद @ Sean.so यदि एकाधिक अनुरोध एक ही विधि का आह्वान कर रहे हैं तो एडीडी(), आवश्यक एनोटेशन उन्हें उसी लेनदेन में चलाने के लिए तैयार करेगा? लेकिन मुझे लगता है कि सभी जोड़ें() विधि आमंत्रण लेन-देन की अवधि में एक दूसरे के लिए स्वतंत्र रहें .. अभी भी भ्रम का थोड़ा सा है – Vish
@ विश नो, कभी नहीं। एक नया अनुरोध हमेशा एक नए धागे में एक नया विधि आमंत्रण का मतलब है और इसलिए एक नया लेनदेन। यह सभी लेनदेन सामग्री एक विधि के आवेषण के भीतर होती है, बाहरीतम एक। यह मुश्किल हो जाता है जब बाहरी विधि आंतरिक लेनदेन विधि कहती है, लेकिन बाहरी विधि को दो बार कॉल करने का अर्थ है दो लेनदेन, चाहे वह किसी वेब संदर्भ में है या नहीं। –