@Transactional (प्रचार = Propagation.REQUIRED)


107

अगर कोई यह व्याख्या कर सकता है कि यह एनोटेशन क्या करता है और जब हम इसका सही उपयोग करते हैं:

@Transactional(propagation=Propagation.REQUIRED)

धन्यवाद


2
क्या आपने इसे पढ़ा है? static.springsource.org/spring/docs/2.5.x/reference/…
ब्रैड

3
Propagation.REQUIRED लेन-देन का डिफ़ॉल्ट प्रसार मोड है, इसलिए आपको इसे स्पष्ट रूप से सेट करने की आवश्यकता नहीं है।
tibtof

जवाबों:


65

जब प्रचार सेटिंग PROPAGATION_REQUIRED की जाती है, तो प्रत्येक पद्धति के लिए एक तार्किक लेन-देन गुंजाइश बनाई जाती है, जिस पर सेटिंग लागू की जाती है। इस तरह के प्रत्येक तार्किक लेन-देन का दायरा व्यक्तिगत रूप से रोलबैक-स्थिति का निर्धारण कर सकता है, बाहरी लेनदेन का दायरा आंतरिक लेनदेन के दायरे से तार्किक रूप से स्वतंत्र है। बेशक, मानक PROPAGATION_REQUIRED व्यवहार के मामले में, इन सभी स्कोपों ​​को समान भौतिक लेनदेन के लिए मैप किया जाएगा। तो आंतरिक लेन-देन के दायरे में सेट किया गया एक रोलबैक-केवल मार्कर वास्तव में प्रतिबद्ध होने के लिए बाहरी लेनदेन के अवसर को प्रभावित करता है (जैसा कि आप इसकी उम्मीद करेंगे)।

यहां छवि विवरण दर्ज करें

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html


166

यदि आपको स्प्रिंग डॉक्स में उपलब्ध कराए गए उपयोग से परे एक स्पष्टीकरण की आवश्यकता है

इस कोड पर विचार करें ...

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

जब doSomething () कहा जाता है, तो यह पता चलता है कि इसे निष्पादित करने से पहले डेटाबेस पर लेनदेन शुरू करना होगा। यदि इस विधि के कॉलर ने पहले ही एक लेन-देन शुरू कर दिया है, तो यह विधि उसी भौतिक का उपयोग करेगी वर्तमान डेटाबेस कनेक्शन पर लेनदेन का ।

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

लेन-देन प्रबंधन एक काफी जटिल विषय है, इसलिए उम्मीद है कि यह सरलीकृत उत्तर सहायक है


8
अगर किसी को दिलचस्पी है, तो मैंने PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED, PROPAGATION_REQUIRED
ब्रैड

अगर यह डीएओ लेयर की घोषणा करने और उस तक पहुंचने के लिए प्रॉक्सी आधारित कॉन्फ़िगरेशन का उपयोग कर रहा है, तो डीएओ क्लास में विधि को @ ट्रांसएक्टेंशियल के साथ भी एनोटेट किया जाना चाहिए।
कुरापिका

यदि आपने @Transactionalअपनी सेवा परत में जोड़ लिया @Transactionalहै, तो उस लेनदेन के भीतर बुलाए जा रहे डीएओ के तरीकों को भी जोड़ने की कोई आवश्यकता नहीं है ।
ब्रैड

अगर doSomething()बिना किसी @transactional के किसी अन्य नेस्टेड विधि को लागू किया जाता है, तो क्या यह उसी लेनदेन के लिए लागू होगा?
इसतरह

हां, जब तक कि एक ही थ्रेड का उपयोग नेस्टेड विधि को निष्पादित करने के लिए किया जा रहा है (यानी आप स्पष्ट रूप से एक नया थ्रेड नहीं बनाते हैं)। इसका कारण यह है कि स्प्रिंग लेनदेन थ्रेडलोक वैरिएबल का उपयोग करके वर्तमान थ्रेड के लिए बाध्य हैं
ब्रैड

15

यदि आप <tx:annotation-driven/>किसी भी वर्ग / विधि के साथ एनोटेशन आधारित लेन-देन सहायता सक्षम करते हैं, तो स्प्रिंग एप्लिकेशन में, यदि आप @ ट्रेंसेक्शनल (प्रोपेगेशन = प्रचार) के साथ किसी भी वर्ग / पद्धति का एनोटेट करते हैं तो स्प्रिंग फ्रेमवर्क एक लेनदेन शुरू करेगा और विधि को निष्पादित करेगा और लेन-देन शुरू करेगा। यदि कोई RuntimeException हुई, तो लेन-देन वापस हो जाएगा।

वास्तव में प्रचार = प्रसार.आधारित डिफ़ॉल्ट डिफ़ॉल्ट स्तर है, आपको इसका स्पष्ट उल्लेख करने की आवश्यकता नहीं है।

अधिक जानकारी के लिए: http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations


5

लेन-देन प्रबंधन के लिए अपनाई गई विभिन्न लेन-देन सेटिंग्स और व्यवहार को समझने के लिए, जैसे REQUIRED,ISOLATION आदि के आपको लेनदेन प्रबंधन की मूल बातें स्वयं समझनी होंगी।

स्पष्टीकरण पर अधिक के लिए ट्रैसैक्शन प्रबंधन पढ़ें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.