2010-11-13 14 views
23

बस वसंत लेनदेन के कामकाज मुझे पता है कि क्या निम्नलिखित मामले में जहां एक विधि @Transactional के रूप में चिह्नित एक और तरीका @Transactional के रूप में चिह्नित कॉल में क्या होता है चाहता हूँ समझने के लिए।वसंत लेनदेन को समझना - क्या होता है जब एक लेनदेन विधि किसी अन्य लेनदेन विधि को कॉल करती है?

मान लें कि कॉन्फ़िगरेशन सभी डिफ़ॉल्ट सेटिंग्स का उपयोग करता है।

@Service("myService") 
@Transactional 
public MyService{ 
    public void myServiceMethod(){ 
     myDAO.getSomeDBObjects(); 
    } 
} 

@Repository("myDAO") 
@Transactional 
public MyDAOWithUsesBeyondMyService{ 
    public void getSomeDBObjects(){...} 
} 

अब अगर मैं MyService.myServiceMethod() दर्ज करने के लिए थे यह स्पष्ट रूप से एक सौदे शुरू होगा। फिर, myDAO.getSomeDBObjects() में ड्रिलिंग पर क्या होगा? क्या तथ्य यह है कि एक लेनदेन पहले से मौजूद है क्योंकि कोई नया लेनदेन पैदा नहीं हुआ है, या क्या मैं यहां दो लेनदेन कर रहा हूं?

प्रचार पर (नीचे उद्धृत) प्रलेखन को कवर करना प्रतीत होता है, लेकिन मैं अपनी समझ को सत्यापित करना चाहता हूं, यह मेरे कुंवारी दिमाग के लिए एक बार में सब कुछ समझने के लिए थोड़ा सा था।

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

उत्तर

33

दो उत्तर:

क) यह मत करो। सेवा परत या दाव परत में @Transactional का प्रयोग करें, लेकिन दोनों (सेवा परत सामान्य विकल्प है, जैसा कि आप शायद सेवा विधि के अनुसार एक लेन-देन चाहते हैं)

ख) यदि आप इसे करते हैं, क्या होता है propagation पर निर्भर करता है @Transactional एनोटेशन की विशेषता और इस खंड में वर्णित है: 10.5.7 Transaction propagation। असल में: PROPAGATION_REQUIRED का अर्थ है कि एक ही लेनदेन दोनों विधियों के लिए उपयोग किया जाएगा, जबकि PROPAGATION_REQUIRES_NEW एक नया लेनदेन शुरू करता है।

अपनी टिप्पणी के बारे में:

पाठ्यक्रम मैं पढ़ रखा और महसूस किया कि, जैसा कि मैंने प्रॉक्सी उपयोग कर रहा हूँ, इस दूसरी विधि व्यवहार प्रॉक्सी द्वारा प्रबंधित नहीं किया जाएगा के

, इस प्रकार यह किसी भी अन्य की तरह है विधि कॉल

यह आपकी स्थिति में सच नहीं है (केवल तभी दोनों विधियां एक ही कक्षा में थीं)।

एक सेम तरीकों a और b, और a कॉल b है, तो b, वास्तविक विधि, नहीं प्रॉक्सी पर कहा जाता है, क्योंकि यह प्रॉक्सी के भीतर से कहा जाता है (एक सेम पता नहीं है कि यह प्रॉक्सी है बाहरी दुनिया में)।

proxy  bean 
a() --> a() 
      | 
      V 
b() --> b() 

अपनी स्थिति में, हालांकि, एक सेवा एक इंजेक्शन दाव वस्तु है, जो एक प्रॉक्सी ही होगा होता है, तो आप इस तरह एक स्थिति होगा:

  proxy  bean 
service a() --> a() 
         | 
      /---------/ 
      |     
      V 
dao  b() --> b() 
+0

धन्यवाद, हाँ, मैं ऐसा करने का इरादा नहीं है, लेकिन जब मुझे एहसास हुआ कि मैंने सेवा कक्षा स्तर पर @ ट्रांसेक्शनल घोषित कर दिया है, तो सेवा को ध्यान में रखा गया था, और सेवा की एक विधि सेवा की एक और विधि (लेनदेन दोनों) को बुला रही थी। बेशक मैंने पढ़ना और महसूस किया कि, जैसा कि मैं प्रॉक्सी का उपयोग कर रहा हूं, यह दूसरी विधि लेनदेन संबंधी प्रॉक्सी द्वारा प्रबंधित नहीं की जाएगी, इस प्रकार यह किसी भी अन्य विधि कॉल की तरह है (जो कि एक नए आरंभ किए गए मस्तिष्क को उलझाने के लिए पर्याप्त है)। :) लेकिन यह मुझे यह सुनिश्चित करने के लिए उत्सुक बना देता है कि मैं यह समझता हूं कि यह सब कैसे काम करता है, आपने स्पष्ट किया है कि मेरे लिए यह अच्छी तरह से है। धन्यवाद! –

+0

@ डेविड मुझे लगता है कि आप प्रॉक्सी अवधारणा को थोड़ा सा गलत समझते हैं। मेरा अपडेट पढ़ें। –

+0

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

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