2011-12-23 9 views
6

स्थिति इस प्रकार है:स्प्रिंग लेन-देन internals

  1. Method1 उस में चार डेटाबेस अद्यतन तरीकों है। विधि 1 स्प्रिंग लेनदेन प्रबंधन अर्थशास्त्र का उपयोग करके एनोटेट किया गया है।

  2. विधि 2 में डेटाबेस रीडिंग विधि है और इसे विधि 1 के बाद अपने सभी डेटाबेस अपडेट निष्पादित करने के बाद लागू किया गया है। स्प्रिंग ट्रांजैक्शन सेमेन्टिक्स का उपयोग करके विधि 2 को भी एनोटेट किया गया है।

  3. एक वेब अनुरोध है जो आता है, नियंत्रक अनुरोध को रोकता है और विधि 1 और फिर विधि 2 को आमंत्रित करता है।

  4. वेब-अनुरोध के आसपास एक लेनदेन लपेटा गया है।

क्या मैं जानने में दिलचस्पी है है:

1.How स्प्रिंग एक सफल लेन-देन पर डेटाबेस अद्यतन प्रतिबद्ध करने के लिए पता है? क्या वसंत कार्यान्वयन का कुछ संदर्भ है जो लेनदेन प्रबंधन करता है?

2. चूंकि हमारे पास लेन-देन का पदानुक्रम है: वेब-अनुरोध के आसपास लेनदेन-> प्रचार के साथ लेनदेन = विधि 1 के लिए अनुरोध नया-> प्रचार के साथ लेनदेन = विधि 2 के लिए आवश्यक, वसंत लेनदेन प्रबंधन कैसे सुनिश्चित करता है सही क्रम के साथ उचित संदर्भ में लेनदेन निष्पादित किए जाते हैं?

संक्षेप में, स्प्रिंग स्प्रिंग लेनदेन प्रबंधन को अपने सभी सबसे मज़ेदार विवरणों या दस्तावेज़ीकरण के संदर्भ में प्ले करने के लिए बहुत अच्छा होगा, जो कि जेटीए या कुछ के आसपास केंद्रित स्पष्टीकरण को आसानी से हाथ से नहीं लेता है अन्य संक्षिप्त नाम।

धन्यवाद

उत्तर

7

कुछ बुनियादी बयान देते हैं।

  1. एक लेनदेन संबंधी संदर्भ एक ऐसा वातावरण है जहां कुछ विशेष गुण (डेटाबेस सत्र) एप्लिकेशन रनटाइम के लिए उपलब्ध कराए जाते हैं जो अन्यथा उपलब्ध नहीं होते हैं। एक लेनदेन संदर्भ आमतौर पर एक लेनदेन का दायरा करने के लिए प्रयोग किया जाता है।
  2. वसंत उपयोग, AOP Proxies और एक्सएमएल मेटाडेटा एक घोषणात्मक लेनदेन प्रबंधन प्राप्त करने के लिए उपयोग करता है।
  3. एनोटेशन का उपयोग किसी विशेष विधि के लेनदेन प्रचार व्यवहार को चिह्नित करने के लिए किया जाता है।
  4. वसंत विधियों पर लेनदेन लागू करने के लिए Interceptor Mechanism का उपयोग करता है।

यहाँ मैं उपरोक्त उदाहरण

MyClass{ 

    @Transactional 
    public void sequence() { 
     method1(); 
     method2(); 
    } 

    @Transactional 
    void method1() { 
    } 

    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    void method2() { 
    } 

} 

@stacker द्वारा देना तुम भी रूप में अच्छी तरह एक्सएमएल विन्यास का उपयोग कर ही कार्यक्षमता प्राप्त कर सकते हैं पुन: उपयोग कर रहा हूँ। चलिए इसे अपने लोकप्रिय और व्यापक रूप से इस्तेमाल करते हैं।

तैनाती के समय

  • स्प्रिंग ढांचे एक्सएमएल विन्यास फाइल (प्रसिद्ध applicationContext.xml) जाँच करता है और कॉन्फ़िगरेशन के आधार पर, (यह मानते हुए कि विन्यास आधारित टिप्पणी के रूप में उल्लेख किया गया है) @Transactional एनोटेशन के लिए कोड को स्कैन करता है।
  • इसके बाद, यह लेनदेन के लिए चिह्नित विधियों के लिए एओपी प्रॉक्सी उत्पन्न करता है। सरल शब्दों में, ये प्रॉक्सी संबंधित तरीकों के आसपास रैपर के अलावा कुछ भी नहीं हैं।
  • इन रैपर विधियों के भीतर, लेनदेन सलाहकार कोड कॉन्फ़िगरेशन (अर्थात् लेनदेन प्रचार) के आधार पर भी उत्पन्न होता है।
  • अब जब इन रैपर विधियों को लेनदेन सलाहकार वास्तविक विधि कॉल से पहले और बाद में चित्र में आता है। ।
  • उदाहरण के लिए छद्म कोड में एक ही प्रतिनिधित्व ऊपर

    ProxyMyClass{ 
        MyClass myclass; 
        . 
        . 
        . 
        sequence(){ 
        //Transaction Advisor code (Typically begin/check for transaction) 
        myclass.sequence(); 
        //Transaction Advisor code(Typically rollback/commit) 
        } 
        . 
        . 
        . 
        } 
    

यह कैसे वसंत लेन-देन प्रबंधकों है। हालांकि मामूली oversimplification।

अब आपके सवालों के जवाब,

.कैसे स्प्रिंग एक सफल लेन-देन पर डेटाबेस अद्यतन प्रतिबद्ध करने के लिए पता है? क्या वसंत कार्यान्वयन का कुछ संदर्भ है जो लेनदेन प्रबंधन करता है?

जब भी आप लेनदेन के तहत एक विधि को कॉल करते हैं, तो आप वास्तव में एक प्रॉक्सी कहते हैं जो पहले लेनदेन सलाहकार (जो लेनदेन शुरू करेगा) निष्पादित करता है, फिर आप वास्तविक व्यापार विधि को कॉल करते हैं, एक बार पूरा होने के बाद, एक अन्य लेनदेन सलाहकार निष्पादित करता है (जो वापस आने वाली विधि विधि के आधार पर, प्रतिबद्ध या रोलबैक लेनदेन करेगा)।

चूंकि हमारे पास लेन-देन का पदानुक्रम है: वेब-अनुरोध के आसपास लेनदेन-> प्रक्षेपण के साथ लेनदेन = विधि 1 के लिए अनुरोध-> प्रचार के साथ लेनदेन = विधि 2 के लिए आवश्यक, लेनदेन सुनिश्चित करने के लिए वसंत लेनदेन प्रबंधन कैसे करता है सही क्रम के साथ उचित संदर्भ में निष्पादित?

लेनदेन पदानुक्रम के मामले में, वसंत ढांचा तदनुसार लेनदेन सलाहकार चेक उत्पन्न करता है। उदाहरण के लिए,

  • विधि 1 (RequestNew) लेनदेन सलाहकार कोड (या लेनदेन सलाह) हमेशा एक नया लेनदेन बनाना होगा।
  • विधि 2 (आवश्यक) लेनदेन सलाहकार कोड (या लेनदेन सलाह) के लिए मौजूदा लेनदेन की जांच की जाएगी और यदि यह मौजूद है या अन्यथा नया लेनदेन तैयार है तो इसका उपयोग करें।

एक image on the spring documentation page है जो इन पहलुओं को बहुत अच्छी तरह से सारांशित करता है।

Typical Spring Transaction Management

आशा इस मदद करता है।

+0

यह एक अविश्वसनीय स्पष्टीकरण था। धन्यवाद –

+0

क्या आप बता सकते हैं कि कॉलर के ऊपर वाले आरेख में नियंत्रक या वेब अनुरोध है? – tintin

+0

@tintin, इससे कोई फर्क नहीं पड़ता कि कॉलर नियंत्रक या कुछ और है। अंत में यह कुछ वर्ग से प्रॉक्सी तक एक विधि कॉल होगा। – Santosh

4
Controller 
@Transactional 
public void sequence() { 
    method1(); 
    method2(); 
} 

@Transactional 
void method1() { 
} 

@Transactional(propagation=Propagation.REQUIRES_NEW) 
void method2() { 
} 

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

Controller 
begin tx1 
    |--------------------> m1 (uses tx1) 
    | 
    | begin tx2 
    |--------------------> m2 (uses tx2) 
    | commit tx2 
commit tx1 
+0

एक विशिष्ट एमवीसी पर्यावरण में लेनदेन नियंत्रक स्तर पर शुरू होता है? या यह @Transactional एनोटेशन के साथ सेवा शुरू होता है जो नियंत्रक invokes? – tintin

+0

@ टिनटिन यदि आपके पास 'निम्न स्तर' सेवाएं हैं तो आप उन्हें विभिन्न लेनदेन (विभिन्न कार्यों के लिए) जोड़ना चाहेंगे, इसलिए आपको अपने नियंत्रक में लेनदेन शुरू करना चाहिए। ट्रांज़ेक्शनल के साथ एनोटेटेड एक विधि मौजूदा लेनदेन में शामिल होती है (उदाहरण के लिए (नियंत्रक में शुरू) – stacker

0

क्या आपने Spring documentation पढ़ा है? मूल रूप से लेनदेन का प्रबंधन करने के लिए एओपी का उपयोग किया जाता है। आपको AOP documentation भी पढ़ना चाहिए। यदि एओपी दस्तावेज पर्याप्त नहीं है तो मेरा सुझाव है कि आप कोड के माध्यम से जाएं। ब्रेक-पॉइंट के साथ डीबग मोड में कोड के माध्यम से कदम उठाना अच्छा होगा।

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