एकल लेनदेन में 2 डीएओ विधियों का प्रबंधन कैसे करें?


12

एक साक्षात्कार में किसी ने मुझसे पूछा: हम एक ही लेनदेन में 2 ट्रांसेक्शनल / डाओ तरीकों का प्रबंधन कैसे करते हैं। वांछित क्षमताएं:

  1. यदि उनमें से कोई भी विफल रहता है, तो हमें दोनों तरीकों को रोलबैक करने की आवश्यकता है।
  2. दोनों तरीकों को एक ही लेनदेन के साथ अलग से जोड़ा जा सकता है।
  3. प्रबंधन DAO परत पर होना चाहिए, सेवा स्तर पर नहीं।

मुझे लगता है: सवाल वसंत लेनदेन प्रबंधन से संबंधित है।

जवाबों:


12

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

इंटरनेट में बहुत सी चर्चा है जो उस दिशा में इंगित करती है जैसे यहाँ , यहाँ और यहाँ

वैसे भी, चूंकि यह एक साक्षात्कार है तो आइए इस प्रश्न को स्वीकार करें। मेरे दृष्टिकोण से, आप @Transactionalदोनों तरीकों से एनोटेशन (या XML कॉन्फ़िगरेशन) का उपयोग कर रहे होंगे और REQUIREDमूल्य के साथ लेन-देन के प्रसार के साथ । इस तरह, जब उन तरीकों में से कोई भी लागू होता है और यदि कोई पिछला लेनदेन मौजूद नहीं है, तो एक नया लेनदेन बनाया जाएगा:

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}

क्या इसका मतलब है foo()और bar()उसी लेनदेन को साझा करें और यदि 1 असफल हो तो 1 भी रोलबैक होगा? क्या आप कुछ स्पष्टीकरण दे सकते हैं?
सतीश पांडे

ठीक है, प्रत्येक विधि अपनी स्वयं की इकाई की घोषणा करती है: प्रत्येक विधि के अंत में tx प्रतिबद्ध होगा और यदि उनमें से कोई भी अपवाद फेंकता है तो उसे रोल-बैक किया जाएगा।
अलोंसो डोमिंगुएज़

इसलिए हमें @Transactional(propagation = REQUIRED)प्रसार और @Transactionalसेवा परत के लिए DAO परत विधि में जोड़ने की आवश्यकता है , लेकिन अगर मैं @TransactionalDAO परत में डालने के बजाय केवल सेवा स्तर पर रखूं, तो क्या अंतर है?
आतिश शिम्पी

propagation = REQUIREDट्रांजेक्शनल एनोटेशन प्रचार के लिए डिफ़ॉल्ट मान है, इसलिए इसे लिखना आवश्यक नहीं है।
डैनियल हिगुएर्स

2

मेरे उत्तर में बसंत और चौखटे को नजरअंदाज करना ..... फ़ंक्शन मापदंडों का उपयोग करने का मूल विचार। मुझे यकीन है कि अवधारणा [यहां रूपरेखा सम्मिलित करें] के भीतर लागू हो सकती है।

आपको 2 डीएओ विधियों के बाहर प्रतिबद्ध / रोलबैक को संभालने की आवश्यकता होगी। इनपुट के रूप में लेनदेन / कनेक्शन लेने के लिए 2 विधियों की आवश्यकता होगी।

psuedo कोड:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}

1 प्रश्न: हम Tran tदोनों विधियों के साथ एक पैरामीटर के रूप में क्यों गुजर रहे हैं । क्या आप कुछ स्पष्टीकरण दे सकते हैं?
सतीश पांडे

@ सतीश, क्योंकि प्रश्न (आइटम # 1 और # 2) में, डीएओ विधियों में लचीलापन होने के साथ-साथ स्वतंत्र रूप से और भरोसेमंद रूप से कहा जाना चाहिए। यदि आप एक स्थानीय-स्कोप लेनदेन के साथ मेथड 1 के अंदर करते हैं तो आप मेथड 2 को लागू करने से पहले मेथड 2 में कुछ गलत होने पर रोल बैक नहीं कर सकते हैं।
माइक 30

0

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


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