2012-05-24 10 views
60

अगर कुछ एक व्याख्या कर सकते हैं यह व्याख्या करना क्या है और हम इसका इस्तेमाल जब वास्तव में:@Transactional (प्रचार = Propagation.REQUIRED)

@Transactional(propagation=Propagation.REQUIRED) 

धन्यवाद

+2

क्या आपने इसे पढ़ा है? http://static.springsource.org/spring/docs/2.5.x/reference/transaction.html#tx-propagation – Brad

+3

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

उत्तर

47

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

enter image description here

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

11

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

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

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

2

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

स्पष्टीकरण पर अधिक के लिए Trasaction management पढ़ें।

104

आप Spring Docs

में प्रदान की जाती है कि परे उपयोग की एक laymans स्पष्टीकरण की जरूरत है इस कोड पर विचार करें ...

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

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

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

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

+1

बहुत बढ़िया आदमी, महान मार्गदर्शन के लिए धन्यवाद .. –

+2

यदि कोई दिलचस्पी लेता है, तो मैंने पोस्ट किया है [PROPAGATION_REQUIRES_NEW, PROPAGATION_NESTED, PROPAGATION_REQUIRED की तुलना में एक समान आम आदमी का उत्तर पोस्ट किया गया है (http://stackoverflow.com/questions/25076718/spring-propagation-examples -इन-लेमन-शब्द/25083505 # 25083505) – Brad

+0

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

8

स्प्रिंग REQUIRED व्यवहार मतलब यह है कि same transaction उपयोग किया जाएगा अगर है एक पहले से ही वर्तमान सेम विधि निष्पादन संदर्भ में लेन-देन खोला उपयोगी है है । यदिकोई मौजूदा लेनदेन स्प्रिंग कंटेनर एक नया बना देगा। यदि REQUIRED व्यवहार के रूप में कॉन्फ़िगर किए गए कई विधियों को नेस्टेड तरीके से बुलाया जाता है तो उन्हें अलग-अलग लॉजिकल लेनदेन सौंपा जाएगा, लेकिन वे सभी समान भौतिक लेनदेन साझा करेंगे। संक्षेप में इसका मतलब है कि यदि एक आंतरिक विधि लेनदेन को रोलबैक का कारण बनती है, तो बाहरी विधि प्रतिबद्ध हो जाएगी और लेनदेन को भी रोलबैक करेगा

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