2011-06-22 13 views
8

मैं प्रचार समर्थन के साथ वसंत लेनदेन करने के उपयोग को समझना चाहता हूं। जावा दस्तावेज़ों का उल्लेख है कि यदि @Transactional(propagation = Propagation.SUPPORTS) की विधि को लेनदेन के भीतर से बुलाया जाता है तो यह लेनदेन का समर्थन करता है लेकिन यदि कोई लेनदेन मौजूद नहीं है, तो विधि गैर-लेनदेन को निष्पादित की जाती है।प्रचार के समर्थन के साथ वसंत लेनदेन

क्या यह Propagation.SUPPORTS के बावजूद वसंत लेनदेन का व्यवहार पहले से ही नहीं है?

 


public class ServiceBean { 

    @Transactional(propagation = Propagation.SUPPORTS) 
    public void methodWithSupportsTx() { 
     //perform some database operations 
    } 
} 

public class OtherServiceBean { 

    @Transactional(propagation = Propagation.REQUIRED) 
    public void methodWithRequiredTx() { 
     //perform some database operations 
     serviceBean.methodWithSupportsTx(); 
    } 
} 

 

ऊपर कोड उदाहरण में, कि क्या methodWithSupportsTx()@Transactional(propagation = Propagation.SUPPORTS) एनोटेशन यह लेन-देन, सही है कि क्या methodWithRequiredTx()@Transactional एनोटेशन, इस पर निर्भर में मार डाला किया जाएगा है की परवाह किए बिना?

तो प्रचार स्तर के समर्थन की आवश्यकता/उपयोग क्या है?

उत्तर

0

यदि कोई अस्तित्व नहीं है तो एक आवश्यक लेनदेन एक नया लेनदेन तैयार करेगा। इसलिए जब आप सेवा Bean.methodWithSupportsTx() को कॉल करते हैं तो एक नया लेनदेन किया जाएगा। यदि आपकी विधि वास्तव में लेनदेन है तो आप वसंत से कोई त्रुटि नहीं देखेंगे यदि कोई लेनदेन मौजूद नहीं है।

+0

मुझे ऐसा नहीं लगता है। एक त्रुटि तब फेंक दी जाती है जब प्रचार स्तर कभी नहीं होता है। प्रचार भी। सपोर्ट्स एक नया लेनदेन नहीं बनाते हैं। –

4

javadoc से:

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

तो, इसका मतलब है कि, उदाहरण के लिए, हाइबरनेट के SessionFactory.getCurrentSession()methodWithSupportsTx() अंदर के कई आमंत्रण एक ही सत्र लौट आते हैं।

+0

मान लीजिए WithSupportsTx() में @Transactional एनोटेशन नहीं है, क्या आप यह कहने का प्रयास कर रहे हैं कि एक ही सत्र वापस नहीं किया जाएगा जब methodWithSupportsTx() को लेनदेन में बुलाया जाता है? –

+0

@ एमिट: दरअसल, 'HibernateTransactionManager' की सामान्य कॉन्फ़िगरेशन के साथ' getCurrentSession() 'को कॉल करने के लिए '@ ट्रांजेक्शनल' प्रयास के बिना" कोई हाइबरनेट सत्र थ्रेड से बंधे नहीं होगा, और कॉन्फ़िगरेशन गैर-लेनदेन वाले किसी के निर्माण की अनुमति नहीं देता है " अपवाद। – axtavt

+0

नहीं, मेरा मतलब था, यदि विधि WithSupportsTx() विधि पर @ ट्रांस्सेन्शनल एनोटेशन नहीं हैं और इस विधि को किसी अन्य विधि से कहा जाता है जो पहले से ही एक लेनदेन में है, तो हाइबरनेट के सत्र Factory.getCurrentSession के एकाधिक आमंत्रण करने पर समान सत्र को हाइबरनेट नहीं करेगा()। यह वही उदाहरण है जो मैंने उपरोक्त मेरे प्रश्न में बताया है - विधि पर @ ट्रांसेक्शनल एनोटेशन WithRequiredTx() एक नया लेनदेन बनाता है और फिर सेवा Bean.methodWithSupportsTx() को कॉल करता है, इसलिए विधि WithSupportsTx() द्वारा निष्पादित कोड पहले से ही एक लेनदेन में होगा, है ना? –

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