javax.transaction.Transactional बनाम org.springframework.transaction.annotation.Transactional


152

मुझे समझ में नहीं आता कि एनोटेशन javax.transaction.Transactionalऔर के बीच वास्तविक अंतर क्या है org.springframework.transaction.annotation.Transactional?

है org.springframework.transaction.annotation.Transactionalका एक विस्तार javax.transaction.Transactionalया वे पूरी तरह से अलग अर्थ है? उनमें से प्रत्येक का उपयोग कब किया जाना चाहिए? @Transactinalसेवा की परत में वसंत और DAO में javax ?

जवाब के लिए धन्यवाद।

जवाबों:


125

वसंत ने वर्षों पहले वसंत बीन के तरीकों को लेन-देन करने के लिए अपने स्वयं के लेन-देन के एनोटेशन को परिभाषित किया है।

जावा ईई 7 ने आखिरकार एक ही काम किया है और अब सीडीजे बीन के तरीकों को ईजेबी विधियों के अलावा लेन-देन करने की अनुमति देता है। तो जावा ईई 7 के बाद से, यह अपने स्वयं के लेन-देन एनोटेशन को भी परिभाषित करता है (यह स्पष्ट रूप से स्प्रिंग एक का पुन: उपयोग नहीं कर सकता है)।

Java EE 7 एप्लिकेशन में, आप Java EE एनोटेशन का उपयोग करेंगे।

एक स्प्रिंग एप्लिकेशन में, आप स्प्रिंग एनोटेशन का उपयोग करेंगे।

उनका उपयोग समान है: कंटेनर (जावा ईई या स्प्रिंग) को सूचित करना कि एक विधि लेन-देन है।


28
इससे अधिक: ब्रह्मांड पर शासन करने के लिए, स्प्रिंग ने अंतर्निहित समर्थन भी जोड़ा javax.transaction.Transactionalताकि कोई भी अतिरिक्त कार्यों के बिना अब स्प्रिंग अनुप्रयोगों में भी इसका उपयोग कर सके। IMO, यह डिजाइन के दृष्टिकोण से काफी बुरा निर्णय था , क्योंकि मेरे अनुभव से बहुत सारे डेवलपर्स ने अपने कोड में इन दोनों को अनजाने में भ्रमित कर दिया, जिसके कारण समस्याएं होती हैं।
युरी नकोनचैनी

16
इसके अलावा, org.springframework.transaction.annotation.Transactionalप्रदान करता है और अधिक विकल्प (जैसे readOnly, timeout) की तुलना मेंjavax.transaction.Transactional
pierrefevrier

1
@ आयु, आपने क्या समस्याएं देखी हैं?
ली ची कीम जूल

1
@LeeCheeKiam कृपया नीचे दो उत्तर देखें
युरी नकोनचाय

50

एक और अंतर यह है कि स्प्रिंग कैसे @ ट्रेंसेशनल एनोटेशन को संभालता है

  • org.springframework.transaction.annotation.Transactional को हमेशा ध्यान में रखा जाता है
  • jJax.transaction.Transactional केवल खाते में लिया जाता है जब EJB3 लेनदेन मौजूद होते हैं। EJB3 लेन-देन की उपस्थिति की जाँच javax.ejb.TransactionAttributeइस बात से की जाती है कि वर्गपथ में कक्षा उपलब्ध है (संस्करण 2.5.3 से 3.2.5 तक)। इस प्रकार आप अपने एनोटेशन को ध्यान में रखते हुए समाप्त कर सकते हैं यदि केवल javax.transaction.Transactionalआपके क्लासपाथ में है और नहीं javax.ejb.TransactionAttribute। यदि आप हाइबरनेट के साथ काम कर रहे हैं तो यह मामला हो सकता है: हाइबरनेट-कोर (4.3.7.Final) jboss-transaction-api_1.2_spec (1.0.0.Final) पर निर्भर करता है, जो प्रदान नहीं करता है javax.ejb.TransactionAttribute


हमेशा नहीं लिया जाता है, उदाहरण के लिए एक निजी विधि पर अगर यह नहीं लिया जाएगा।
strash

36

कृपया सावधान रहें, (यह मुद्दा बिलाव में हुआ),

यदि आपका आवेदन SPRING वेब अनुप्रयोग है और आप स्प्रिंग के लेनदेन से निपटने वाले तंत्र का उपयोग कर रहे हैं @org.springframework.transaction.annotation.Transactional, तो इसे javax.transaction.Transactional के साथ न मिलाएं।

यह हमेशा उपयोग होता है, @org.springframework.transaction.annotation.Transactionalलगातार वसंत आवेदन में।

अन्यथा हम इस त्रुटि के साथ समाप्त हो सकते हैं,

org.springframework.orm.jpa.JpaSystemException: commit failed; nested exception is org.hibernate.TransactionException: commit failed

........

Caused by: java.sql.SQLException: Protocol violation: [0]

1
नोट: यह उत्तर मेरे उत्तर का एक विशेष मामला है
Jidehem

3

घोषणात्मक लेनदेन गुंजाइश

स्प्रिंग और जेपीए @Transactionएनोटेशन दोनों आपको दिए गए एप्लिकेशन लेनदेन के दायरे को परिभाषित करने की अनुमति देते हैं।

इसलिए, यदि किसी सेवा पद्धति को एनोटेशन के साथ एनोटेट किया जाता है @Transactional, तो यह एक लेन-देन के संदर्भ में चलेगा। यदि सेवा पद्धति कई DAO या रिपॉजिटरी का उपयोग करती है, तो सभी रीड एड ऑपरेशन एक ही डेटाबेस लेनदेन में निष्पादित किए जाएंगे।

वसंत @Transactional

org.springframework.transaction.annotation.Transactionalएनोटेशन स्प्रिंग ढांचे के 1.2 संस्करण (2005 लगभग) के बाद से उपलब्ध किया गया है, और यह आप निम्नलिखित व्यवहार गुणों को सेट करने की अनुमति देता है:

  • isolation: अंतर्निहित डेटाबेस अलगाव स्तर
  • noRollbackForऔर noRollbackForClassName: जावा Exceptionवर्गों की सूची जो बिना लेन-देन रोलबैक को ट्रिगर किए ट्रिगर की जा सकती है
  • rollbackForऔर rollbackForClassName: जावा Exceptionवर्गों की सूची जो फेंके जाने पर लेनदेन रोलबैक को ट्रिगर करती है
  • propagation: PropagationEnum द्वारा दिया गया लेन-देन प्रसार प्रकार । उदाहरण के लिए, यदि लेन-देन का संदर्भ विरासत में दिया जा सकता है (जैसे, REQUIRED) या एक नया लेन-देन संदर्भ बनाया जाना चाहिए (जैसे, REQUIRES_NEW) या यदि कोई अपवाद नहीं है तो अपवाद को फेंक दिया जाना चाहिए (उदाहरण के लिए MANDATORY) या यदि अपवाद को फेंक दिया जाना चाहिए। यदि एक वर्तमान लेन-देन संदर्भ पाया जाता है (जैसे, NOT_SUPPORTED)।
  • readOnly: क्या वर्तमान लेन-देन को बिना किसी परिवर्तन को लागू किए केवल डेटा पढ़ना चाहिए।
  • timeout: लेन-देन के संदर्भ को कितने सेकंड तक चलने देना चाहिए जब तक कि टाइमआउट अपवाद को फेंक न दिया जाए।
  • valueया transactionManager: TransactionManagerलेन-देन के संदर्भ को बाध्य करते समय स्प्रिंग बीन का नाम इस्तेमाल किया जाएगा।

जावा ईई @Transactional

javax.transaction.Transactionalएनोटेशन (2013 लगभग) जावा ईई 7 विनिर्देश द्वारा जोड़ा गया है। तो, 8 वर्ष बाद जावा ईई एनोटेशन को जोड़ा गया जो कि उसका स्प्रिंग प्रतिरूप है।

जावा ईई @Transactionalसिर्फ 3 विशेषताओं को परिभाषित करता है:

  • dontRollbackOn: Exceptionलेन-देन रोलबैक को ट्रिगर किए बिना जावा वर्गों की सूची को ट्रिगर किया जा सकता है
  • rollbackOn: जावा Exceptionवर्गों की सूची जो फेंक दिए जाने पर लेनदेन रोलबैक को ट्रिगर करती है
  • value: TxTypeएनोम द्वारा दी गई प्रचार रणनीति । उदाहरण के लिए, यदि लेन-देन का संदर्भ विरासत में दिया जा सकता है (जैसे, REQUIRED) या एक नया लेन-देन संदर्भ बनाया जाना चाहिए (जैसे, REQUIRES_NEW) या यदि कोई अपवाद नहीं है तो अपवाद को फेंक दिया जाना चाहिए (उदाहरण के लिए MANDATORY) या यदि अपवाद को फेंक दिया जाना चाहिए। यदि एक वर्तमान लेन-देन संदर्भ पाया जाता है (जैसे, NOT_SUPPORTED)।

कौन सा चुनना है?

यदि आप स्प्रिंग या स्प्रिंग बूट का उपयोग कर रहे हैं, तो स्प्रिंग @Transactionalएनोटेशन का उपयोग करें , क्योंकि यह आपको जावा ईई @Transactionalएनोटेशन से अधिक विशेषताओं को कॉन्फ़िगर करने की अनुमति देता है ।

यदि आप अकेले जावा ईई का उपयोग कर रहे हैं, और आप अपने आवेदन को जावा ईई एप्लिकेशन सर्वर पर तैनात करते हैं, तो जावा ईई `` @ ट्रांसेक्शनल `एनोटेशन का उपयोग करें।

स्प्रिंग या जावा ईई @Transactionalपरिभाषाओं का उपयोग करते समय अलगाव स्तर विन्यास अलग कैसे होता है, इस बारे में अधिक जानकारी के लिए , इस लेख को देखें

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