/ / ईजेबी सेम सेम-प्रबंधित लेनदेन के साथ "लेनदेन बाधा" के रूप में क्यों काम करते हैं? - जावा-ई, लेनदेन, ईजेबी, बीन-प्रबंधित-लेनदेन

बीन-प्रबंधित लेनदेन के साथ EJB सेम एक "लेनदेन बाधा" के रूप में क्यों काम करते हैं? - जावा-ई, लेनदेन, ईजेबी, बीन-प्रबंधित-लेनदेन

से एक उद्धरण EJB 3.1 विनिर्देश:

13.6.1 बीन-प्रबंधित लेनदेन सीमांकन

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

दूसरी ओर, स्टैंड-अलोन क्लाइंट या किसी अन्य EJB से लेन-देन का उपयोग करके सेम में प्रचारित किया जाता है कंटेनर-प्रबंधित लेनदेन। सीएमटी के नजरिए से इसे देखने पर ऐसा लगता है कि सीएमटी का उपयोग करने वाले बीन्स में एक अतिरिक्त महत्वपूर्ण विशेषता (लेन-देन का प्रसार) है।

इस प्रतिबंध ("लेन-देन में बाधा") का कारण बीएमटी का उपयोग करके सेम पर लगाया जा रहा है?

संबंधित सवाल:

उत्तर:

जवाब के लिए 2 № 1

मेरा "अनुमान" यही होगा

कंटेनर "देखता है" कि आपने सेम को बीएमटी के रूप में चिह्नित किया है

तो कुछ बिंदु पर आप संभवत: UserTransaction ऑब्जेक्ट और उसके प्रारंभ / प्रतिबद्ध / रोलबैक आदि विधियों का उपयोग करेंगे

और चूंकि ट्राइड नेस्टेड लेनदेन वेबलॉजिक / ओरेकल आदि द्वारा समर्थित नहीं हैं। कंटेनर के पास नया लेन-देन करने में सक्षम होने के लिए वर्तमान लेनदेन को निलंबित करने के अलावा कोई विकल्प नहीं है

सीएमटी के मामले में - जब से आप आवश्यकता का उपयोग करते हैं, या आवश्यक है - कंटेनर "आपके इरादे" को जानता है और उसी लेनदेन को जारी रखने के लिए धोखा देता है, या उसी के अनुसार एक नया शुरू करता है।


जवाब के लिए 0 № 2

मैं उत्तर से सहमत हूँ Kalpesh Soni बस मैं थोड़ा और जोड़ना चाहूंगा।

कंटेनर एक से दूसरे EJB कॉल को चलाने के लिए एक ही धागे का उपयोग करता है। एक धागा टीएम द्वारा प्रबंधित केवल एक वैश्विक लेनदेन के साथ बाध्य हो सकता है। इसीलिए @Asynchronous बीन कॉल लेनदेन (EJB 3.2 कल्पना, 4.5.3 लेनदेन) का प्रचार नहीं करता है। लेन-देन को "अधिक थ्रेड्स पर विभाजित नहीं किया जा सकता है और यह कॉल करने वाले के लिए बाध्य है।"

यदि बीन को सीएमटी के रूप में चिह्नित किया जाता है, तो कंटेनर एनोटेशन या से ली गई जानकारी के आधार पर लेनदेन कृतियों का प्रबंधन करता है ejb-jar.xml वर्णनकर्ता। कंटेनर तब यह तय करने में सक्षम होता है कि बीन मेथड कॉल वर्तमान में चल रहे लेनदेन का हिस्सा होगा या एक नया निर्माण करने की आवश्यकता है। जैसा कि उल्लेखित नेस्टेड लेनदेन जावा ईई कंटेनर में से अधिकांश में समर्थित नहीं है। मेरी समझ से इसका मुख्य कारण है XAResource नेस्टेड लेनदेन का समर्थन नहीं करता है (देखें JTA कल्पना)।

बीएमटी बीन का उपयोग करता है UserTransaction अपने दम पर लेनदेन प्रबंधन को चलाने के लिए। बीएमटी के लिए मौजूदा लेन-देन का प्रसार कैसे काम करना चाहिए या बेहतर होगा कि आप इसके साथ क्या कर सकते हैं? यदि आप के साथ एक नया लेनदेन शुरू करना चाहते हैं UserTransaction.begin() तब वर्तमान में चल रहे एक को निलंबित कर दिया जाएगा। यह अब प्रसार कैसे काम करता है। मेरा मतलब है कि लेनदेन प्रचारित नहीं है, लेकिन बीएमटी बीन कॉल पर निलंबित है। दूसरी चीज जो आप कर सकते हैं वह है ड्राइव ट्रांजेक्शन। इसका मतलब उपयोग है UserTransaction.commit() या UserTransaction.rollback() आने वाले लेन-देन पर। यदि आप ऐसा करते हैं तो रिटर्न पर कॉल करने वाला इसके संदर्भ में कोई सक्रिय लेनदेन नहीं करेगा। जिसका अर्थ है कि एक अलग बीन के लिए एक कॉल आपके लेनदेन के साथ काम कर सकती है, क्योंकि कॉलर को पता है और इसके बारे में सूचित किया जा रहा है। मुझे लगता है कि आप "यह संभव नहीं करना चाहते हैं। यह" पीछे के कारणों के बारे में मेरी समझ है।

बीएमटी के बारे में एक और मजेदार बात है। यदि आप SLSB (स्टेटलेस सेशन बीन) का उपयोग करते हैं, तो आपको लेनदेन को पूरा किए बिना तथाकथित विधि से बाहर निकलने की अनुमति नहीं है (देखें) EJB 3.2: 8.3.3 एंटरप्राइज बीन्स बीन-मैनेजेड ट्रांजैक्शन डिमार्केशन का उपयोग करते हुए)। दूसरी ओर SFSB (स्टेटफुल सेशन बीन) लेनदेन को खत्म किए बिना एक विधि से बाहर निकल सकता है और जिसे अन्य कॉल में समाप्त किया जा सकता है। यदि ऐसी कॉल ई.जी. लेन-देन की तुलना में अलग-अलग HTTP सत्र में निलंबित कर दिया गया है और वर्तमान थ्रेड से और बाद में सक्रिय और नए थ्रेड पर पिन किया गया है।

javax / transaction / xa / XAResource.html "XAResource Java EE 7 API"


जवाब के लिए 0 № 3

मैंने इस पर एक छोटी सी खोज की, लब्बोलुआब यह है कि-जैसे @Kalpesh सोनी ने ऊपर कहा- Container knows exactly what It"s doing to propagate the transaction, but leaving it to you, It"s expected that you might create a scenario that causes problems due to the details of the underlying server that you use direclty ... में यह लिंकलेखक एक निश्चित परिदृश्य का वर्णन करता है जो विशेष रूप से वेबलॉग + एक सनकी अनुप्रयोग व्यवहार के साथ एक समस्या बनाता है .... वह यह भी बताता है कि यह कार्यक्षमता कैसे उपलब्ध है लेकिन इसमें नहीं है UserTransaction इंटरफ़ेस सीधे लेकिन इसके कार्यान्वयन में से एक में


उत्तर के लिए -1 № 4

जब आप BMT का उपयोग करते हैं, तो आप लेन-देन का प्रबंधन करते हैं। तुम इस्तेमाल UserTransaction लेन-देन बनाने और करने के लिए।

यहाँ बात यह है कि UserTransaction वर्तमान थ्रेड में लेन-देन बनाएं और जब आप किसी अन्य ईजेबी को कॉल करते हैं, तो उस कॉल को दूसरे थ्रेड (अपने स्वयं के ईजेबी के जीवन चक्र के साथ) में निष्पादित किया जाएगा।

सीएमटी में, कंटेनर लेनदेन को संभालने के लिए विधि आह्वान पर हस्तक्षेप करता है।

3.1 यूजरट्रांसलेशन इंटरफ़ेस (JTA विनिर्देशन से)

UserTransaction.begin विधि एक वैश्विक लेनदेन शुरू करती है और कॉलिंग थ्रेड के साथ लेनदेन को जोड़ता है। लेनदेन-से-थ्रेड एसोसिएशन को पारदर्शी रूप से प्रबंधित किया जाता है लेन-देन प्रबंधक।

नेस्टेड लेनदेन के लिए समर्थन की आवश्यकता नहीं है। उपयोगकर्ताआरंभ विधि NotSupportedException को फेंकता है जब कॉलिंग थ्रेड पहले से ही एक लेनदेन और के साथ जुड़ा हुआ है लेनदेन प्रबंधक कार्यान्वयन नेस्टेड का समर्थन नहीं करता है लेन-देन।

3.2.2 एक लेन-देन को पूरा करना

TransactionManager.commit पद्धति लेनदेन को पूरा करती है वर्तमान में कॉलिंग थ्रेड से संबद्ध है। कमिट विधि के बाद रिटर्न, कॉलिंगधागा लेनदेन से जुड़ा नहीं है। अगर जब थ्रेड किसी के साथ जुड़ा नहीं होता है तो कमिट विधि को कहा जाता है लेन-देन संदर्भ, टीएम एक अपवाद फेंकता है।

13.2.5 कंटेनर-प्रबंधित सीमांकन (ईजेबी विनिर्देश से)

जब भी कोई ग्राहक किसी एंटरप्राइज़ बीन के व्यवसाय पर एक विधि लागू करता है इंटरफ़ेस (या नो-इंटरफ़ेस दृश्य या होम या घटक इंटरफ़ेस पर) एक उद्यम बीन की), कंटेनर विधि पर निर्भर करता है मंगलाचरण। इंटरपोजिशन कंटेनर को नियंत्रित करने की अनुमति देता है लेन-देन के माध्यम से घोषणात्मक रूप से लेनदेन का सीमांकन डेवलपर द्वारा निर्धारित विशेषता।