c# - Handle race condition -
मैं ASP.NET MVC और इकाई फ़्रेमवर्क (संस्करण 5) के साथ वित्तीय अनुप्रयोग विकसित कर रहा हूं।
मेरे आवेदन में, उपयोगकर्ता लेनदेन को स्वीकार या अस्वीकार कर सकते हैं अगर कोई प्रयोक्ता स्वीकार करता है, तो धन हस्तांतरण होगा और अनुमोदन अधिसूचना ईमेल भेजा जाएगा, अन्यथा अधिसूचना ईमेल को अस्वीकार कर दिया जाएगा।
मुझे चिंता है , अगर दो उपयोगकर्ता एक ही लेनदेन को एक साथ अनुमोदन करने के लिए आओ उपयोगकर्ता लेनदेन की स्थिति "WaitForApprove" प्राप्त करेगा और दोहरे स्थानान्तरण कर सकता है (यदि दोनों उपयोगकर्ता अनुमोदन करते हैं तो)। मैं इस स्थिति को कैसे प्रबंधित कर सकता हूँ , सबसे अच्छा समाधान क्या है भावना और amp; कम संसाधनों का उपभोग)। मैंने कुछ शोध किया है, मैंने पाया म्यूटक्स इसे संभाल सकता है। लेकिन मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है। यहां मेरा मूल कोड दिखता है (म्यूटक्स लागू नहीं है)। आपको पूरी तरह से उपयोगकर्ता इंटरफ़ेस से पैसा ट्रांसफर करने की ज़िम्मेदारी को अलग करना होगा। यूजर इंटरफेस को ट्रांसफर की स्थिति सीधे सेट करने की अनुमति न दें। इसके बजाय, ऑब्जेक्ट पर एक्सप्रेस्ड ट्रांस्फर () और रिजेक्ट ट्रान्सफर () जैसे ऑब्जेक्ट की मौजूदा स्थिति की जांच करें और केवल अनुरोधित कार्रवाई करते हैं यदि ऑब्जेक्ट एक में है उचित अवस्था। वस्तु को भी यह सुनिश्चित करने के लिए एक तंत्र की आवश्यकता है कि उपयुक्त स्थिति किसी भी वस्तु आवृत्ति के लिए जानी जाती है, अनुरोध किए गए कार्रवाई के बाद एक भी एक अलग ऑब्जेक्ट इंस्टेंस में प्रारंभ हो, संभवतः अलग सर्वर ऐसा करने के लिए, आपको डाटाबेस में चालू करना होगा। डेटाबेस में उस स्थिति को रखने के लिए सबसे अच्छी रणनीति यह निर्भर करती है कि आप वास्तव में लेनदेन कैसे करते हैं। यदि आपको ऑब्जेक्ट पर एक फ्लैग सेट करना है (जिसे संभवत: किसी अन्य प्रक्रिया द्वारा उठाया गया है), तो आशावादी संगामिति के साथ एक डेटाबेस लेन-देन पर्याप्त होगा। यदि आपका ऑब्जेक्ट शुरू हो रहा है अन्य सिस्टम (शायद एक हस्तांतरण को शुरू करने के लिए एक वेब सेवा कॉल) के लिए कॉल, आपको डाटाबेस (लेनदेन के साथ) में पंक्ति को लॉक करना होगा।
सार्वजनिक शून्य ट्रांजैक्शन एस्प्रॉवल (int sysTransferInfoID, स्ट्रिंग उपयोगकर्ता नाम, स्ट्रिंग कमांड) {// लेनदेन प्राप्त करें Var info = _transInfoRepo.GetSingle (i = & gt; i.SYS_TRANSFER_INFO_ID == sysTransferInfoID); अगर (info.SYS_TRANSFER_STATE_ID! = (Int) eTransferState.WaitForApprove) // चेक स्थिति {If (command == "Approve") {// स्थानांतरण के लिए दूसरी सेवा कॉल करें यहां। // दूसरे उपयोगकर्ताओं को फंड ट्रांसफर सूचना ईमेल स्वीकार करने के लिए भेजा। Info.SYS_TRANSFER_STATE_ID = (इंट) eTranferState.Approved; // अवस्था बदलो। Info.APPROVE_BY = उपयोगकर्ता नाम; } और अगर (कमांड == "अस्वीकार करें") {// अन्य उपयोगकर्ताओं को धन हस्तांतरण अधिसूचना ईमेल अस्वीकृत कर दिया गया। Info.SYS_TRANSFER_STATE_ID = (int) eTranferState.Rejected; // अवस्था बदलो। Info.APPROVE_BY = उपयोगकर्ता नाम; } _context.SaveChanges (); } और (नया अपवाद फेंकना ("लेनदेन को मंजूरी नहीं दे सकता।"); }}
Comments
Post a Comment