2009-03-24 17 views
7

के साथ लेनदेन का उपयोग करना मेरे पास एक स्थिति है (मुझे अनुमान है कि यह मानक है) जहां मुझे कुछ व्यवसायिक गणना करने और डेटाबेस में रिकॉर्ड्स का एक समूह बनाने की आवश्यकता है। अगर किसी भी समय कुछ भी गलत हो जाता है तो मुझे डेटाबेस से सब कुछ वापस रोल करने की आवश्यकता होती है। Obviosly मुझे किसी तरह के लेनदेन की जरूरत है। मेरा सवाल यह है कि मैं लेनदेन समर्थन कहां लागू करूं? यहाँ मेरी उदाहरणबिजनेस प्रोसेस और रिपोजिटरी पैटर्न

//BillingServices - This is my billing service layer. called from the UI 
public Result GenerateBill(BillData obj) 
{ 
    //Validate BillData 

    //Create a receivable line item in the receivables ledger 
    BillingRepository.Save(receivableItem); 

    //Update account record to reflect new billing information 
    BillingRepository.Save(accountRecord); 

    //...do a some other stuff 
    BillingRepository.Save(moreStuffInTheDatabase); 
} 

अगर डेटाबेस के लिए अद्यतन के किसी भी असफल मैं अन्य लोगों को वापस रोल और बाहर निकलने की जरूरत है। मैं बस अपना भंडार के माध्यम से एक कनेक्शन वस्तु जिसमें मैं

Connection.BeginTransaction (कॉल कर सकते हैं)

बेनकाब या मैं मैं सिर्फ सेवा परत में मान्य और बस भंडार है कि सभी की बचत होती है में एक विधि कॉल करते है वस्तुओं और लेनदेन संभालती है? यह मेरे लिए बिल्कुल सही नहीं लगता है। ऐसा लगता है कि यह मुझे डेटा परत में अधिक व्यावसायिक तर्क देने के लिए मजबूर करेगा।

सही दृष्टिकोण क्या है? अगर मुझे भंडारों को फैलाने की ज़रूरत है (या वह खराब डिजाइन होगा) तो क्या होगा?

+1

+1, अच्छा सवाल। –

+0

उम्मीद है कि मुझे एक अच्छा जवाब मिलेगा =)। असल में इस बिंदु पर कोई भी जवाब अच्छा होगा – Micah

उत्तर

5

मुझे लगता है कि आप यहां .NET का उपयोग कर रहे हैं। यह मामला है, आप using statement में TransactionScope उदाहरण के साथ पूरे कोड अनुभाग को आसानी से लपेट सकते हैं और यह आपके लिए लेनदेन सेमेन्टिक्स को संभालेगा। आप बस अंत में Complete method कॉल करनी होगी:

//BillingServices - This is my billing service layer. called from the UI 
public Result GenerateBill(BillData obj) 
{ 
    // Create the transaction scope, this defaults to Required. 
    using (TransactionScope txScope = new TransactionScope()) 
    { 
      //Validate BillData 

      //Create a receivable line item in the receivables ledger 
      BillingRepository.Save(receivableItem); 

      //Update account record to reflect new billing information 
      BillingRepository.Save(accountRecord); 

      //...do a some other stuff 
      BillingRepository.Save(moreStuffInTheDatabase); 

      // Commit the transaction. 
      txScope.Complete(); 
    } 
} 

एक अपवाद तब होता है, तो यह ना बुलाने Complete जब कोड ब्लॉक से बाहर निकल गया है प्रभाव पड़ता है; TransactionScopeIDisposable interface के कार्यान्वयन पर using कथन का दायरा बाहर निकला है।

Dispose कॉल में, यह जांचता है कि लेनदेन पूरा हुआ है या नहीं (यह स्थिति Complete सफल होने पर सेट की गई है)। यदि वह राज्य सेट नहीं है, तो यह रोलबैक करता है।

आप इसे कई TransactionScope उदाहरणों (उसी थ्रेड पर अपने कॉल स्टैक में गहराई से) के भीतर घोंसला कर सकते हैं ताकि एकाधिक भंडारों में बड़े लेनदेन किए जा सकें।

+0

तो क्या मैं सुंदर मानक कर रहा हूं, और क्या यह समाधान सबसे आम है? – Micah

+0

@ मिकाह: मान लीजिए कि आप .NET का उपयोग कर रहे हैं, हां, यह एक पसंदीदा तरीका है जब आप कई विधियों/ऑब्जेक्ट्स/लेनदेन संबंधी भंडारों में लेनदेन करना चाहते हैं। – casperOne

+0

बहुत बढ़िया! आपका बहुत बहुत धन्यवाद! – Micah

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