2010-03-25 5 views
26

किसी को भी व्याख्या कर सकते हैं के बीच अंतर क्या है? और यदि मैं लेनदेन में तालिका में तीन पंक्तियां डालना चाहता हूं तो मैं अपने सत्र मुखौटा में इसे कैसे करना चाहिए।क्या @Resource UserTransaction और EntityManager.getTransaction के बीच का अंतर()

+1

ईजेबी लेनदेन, आईएमओ के बारे में बेहतर विचार पाने के लिए एक अच्छा लेख, http://entjavastuff.blogspot.com/2011/02/ejb-transaction-management-going-deeper.html – thirdy

उत्तर

26

ईजेबी लेनदेन संबंधी घटक हैं। लेनदेन को या तो आवेदटन सर्वर (सीएमटी - कंटेनर-प्रबंधित लेनदेन) द्वारा या मैन्युअल रूप से ईजेबी (बीएमटी - बीन-प्रबंधित लेनदेन) के भीतर प्रबंधित किया जा सकता है।

ईजेबी जेटीए विनिर्देश के माध्यम से वितरित लेनदेन का समर्थन करता है। वितरित लेनदेन को UserTransaction का उपयोग करके नियंत्रित किया जाता है, जिसमें begin, commit, rollback विधियां हैं।

सीएमटी के साथ, एप्लिकेशन सर्वर आपके लिए लेनदेन (transaction annotations के अनुसार) शुरू करता है, प्रतिबद्ध करता है और रोलबैक करता है और आपको हस्तक्षेप करने की अनुमति नहीं है। इसका मतलब है कि आपको इस मामले में UserTransaction तक नहीं पहुंचना चाहिए। हालांकि, बीएमटी के साथ, आप मैन्युअल रूप से ऐसा करते हैं और आप UserTransaction का उपयोग कर लेनदेन को नियंत्रित करते हैं।

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

अधिकांश समय, आप ईजेबी पर @Required एनोटेशन के साथ सीएमटी का उपयोग करते हैं। इसका मतलब है कि आपको न तो UserTransaction और न ही EntityManager.getTransaction तक पहुंचने की आवश्यकता नहीं है। अप्प। सर्वर शुरू होता है और लेनदेन करता है, लेकिन अपवाद उठाए जाने पर रोलबैक की भी देखभाल करता है। यही वह है जो मैं आपके मुखौटा के लिए सिफारिश करता हूं।

(जैसे PersistenceContextType या EntityManager.joinTransaction के साथ वितरित लेनदेन में इकाई प्रबंधक के मैनुअल में भर्ती के रूप में अधिक बारीकियों, कर रहे हैं, लेकिन यह केवल यदि आप डिफ़ॉल्ट के रूप में एक अलग अलग तरीकों से प्रौद्योगिकी का उपयोग)।

+3

क्या आपको यकीन है कि 'EntityManager # getTransaction() 'एक ऐप सर्वर के अंदर चलते समय जेटीए वितरित लेनदेन के साथ सहयोग करता है? मुझे नहीं लगता कि यह करता है, मेरी समझ यह है कि यह एक संसाधन-स्थानीय लेनदेन देता है जिसका उपयोग वर्तमान जेटीए लेनदेन के बाहर * बाहर * जारी रखने के लिए किया जा सकता है। –

+0

@ पास्कल 'EntityManager' जेटीए के साथ सहयोग करता है, इसलिए आपको' EntityManager # getTransaction' का उपयोग नहीं करना चाहिए। जावाडोक के अनुसार, 'एंटीटी मैनेजर # getTransaction' को JTA EntityManager पर लागू होने पर 'IllegalStateException' फेंकता है। – ewernli

+2

दरअसल, 'GetTransaction' JTA EntityManager पर लागू होने पर अपवाद फेंकता है)। असल में, मेरे मन में जो उदाहरण था ("प्रो जेपीए 2" से) एक सत्र बीन में एक अनुप्रयोग प्रबंधित, संसाधन-स्थानीय ईएम प्राप्त करना है - उदा। लेखापरीक्षा लॉगिंग के लिए - और एक संसाधन स्थानीय लेनदेन जिसे आप जेटीए लेनदेन के बाहर जितनी बार चाहें शुरू/प्रतिबद्ध कर सकते हैं। लेकिन मुझे एहसास है कि मैंने आपके जवाब को गलत तरीके से पढ़ा है, यह आपके द्वारा लिखे गए कार्यों से अलग है। धन्यवाद! –

7

UserTransactionजेटीए लेनदेन इकाई को संदर्भित करता है। एप्लिकेशन सर्वर में कोई जेटीए मॉड्यूल उपलब्ध होने पर आप इसका उपयोग कर पाएंगे: उदाहरण के लिए, यदि आप टॉमकैट पर डिफ़ॉल्ट रूप से एप्लिकेशन को तैनात कर रहे हैं (जो डिफ़ॉल्ट रूप से जेटीए का समर्थन नहीं करता है), तो इस पर निर्भर कोड विफल हो जाएगा । यह ईजेबी और एमडीबी में उपयोग किए जाने वाले डिफ़ॉल्ट प्रकार का लेनदेन है।

EntityManager.getTransaction()स्थानीय लेनदेन इकाई पुनर्प्राप्त करता है। इसे कभी-कभी संसाधन स्थानीय लेनदेन के रूप में भी जाना जाता है।

संसाधन स्थानीय लेनदेन जेटीए लेनदेन से बहुत अलग हैं: अन्य चीजों के साथ, संसाधन स्थानीय लेनदेन संसाधन के लिए विशिष्ट हैं, जबकि जेटीए लेनदेन एक विशेष धागे के लिए विशिष्ट होते हैं।@ मार्को के जवाब जो अच्छी तरह से करता है JTA के बीच अंतर बताने और स्थानीय लेनदेन संसाधन के अलावा What is the difference between a JTA and a local transaction?

0

:

संसाधन स्थानीय और JTA लेनदेन के बीच अंतर के बारे में अधिक जानकारी के लिए इस यहाँ का जवाब Stackoverflow देखते हैं।

कंटेनर प्रबंधित लेनदेन [जैसा कि इसका नाम है] आपके आवेदन के बजाय कंटेनर द्वारा प्रबंधित किया जाता है। यह ईजेबी टियर के माध्यम से किया जाता है जहां आपको बस अपनी विधि लिखने की आवश्यकता होती है और कंटेनर एक लेनदेन संदर्भ के आसपास विधि को लपेट लेगा ताकि यदि आपकी विधि या उसके निचले स्तर के कॉल का कोई भी हिस्सा अपवाद फेंकता है, लेनदेन रोलबैक होगा।

यह एनोटेशन का उपयोग करके ठीक से ट्यून किया जा सकता है। अधिक जानकारी यहां मिल सकती है https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

ध्यान दें कि यह केवल ईजेबी के माध्यम से किया जाता है, और वेब स्तरीय (जैसे सर्वलेट्स या आरईएसटी एपीआई) पर इंजेक्शन वाले इकाई प्रबंधकों को कंटेनर द्वारा प्रबंधित नहीं किया जाता है, इस मामले में आपको @Resource UserTransaction या EntityManager.getTransaction, begin() और commit() का उपयोग करके लेनदेन को देखें।

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

+0

ईई कंटेनर प्रबंधित लेनदेन में "@ ट्रांसेक्शनल" एनोटेशन के माध्यम से ईजेबी के बाहर उपलब्ध हैं। –

+0

जेटीए लेनदेन * आवश्यक * सीएमटी नहीं हैं, क्योंकि जेटीए को बिट्रोनिक्स और एटमिकोस जैसे पुस्तकालयों के साथ एप्लिकेशन सर्वर (या "कंटेनर") के बाहर इस्तेमाल किया जा सकता है। – Marco