इकाई ढांचे के साथ आप इसे "परमाणु" ऑपरेशन नहीं बना सकते हैं। आपके पास चरण हैं:
- डेटाबेस से इकाई लोड करें
- स्मृति में काउंटर बदलें
- परिवर्तित निकाय को डेटाबेस में सहेजें
इन चरणों के बीच कोई अन्य क्लाइंट उस डेटाबेस से इकाई को लोड कर सकता है जिसका अभी भी पुराना मान है।
इस स्थिति से निपटने का सबसे अच्छा तरीका है आशावादी समरूपता . का उपयोग करना . इसका मूल रूप से मतलब है कि चरण 3 में परिवर्तन सहेजा नहीं जाएगा यदि काउंटर अब पहले जैसा नहीं है जब आपने चरण 1 में इकाई को लोड किया था। इसके बजाय आपको एक अपवाद मिलेगा जिसे आप इकाई को पुनः लोड करके संभाल सकते हैं और परिवर्तन को फिर से लागू करना।
कार्यप्रवाह इस तरह दिखेगा:
Work
में इकाईWordCount
संपत्ति को एक समवर्ती टोकन के रूप में चिह्नित किया जाना चाहिए (कोड-फर्स्ट के मामले में एनोटेशन या धाराप्रवाह एपीआई)- डेटाबेस से इकाई लोड करें
- स्मृति में काउंटर बदलें
- कॉल करें
SaveChanges
try-catch
. मेंDbUpdateConcurrencyException
. प्रकार के अपवादों को ब्लॉक करें और पकड़ें - यदि कोई अपवाद होता है, तो इकाई को
catch
में पुनः लोड करें डेटाबेस से ब्लॉक करें, परिवर्तन को फिर से लागू करें औरSaveChanges
. पर कॉल करें फिर से - आखिरी चरण तब तक दोहराएं जब तक कि कोई अपवाद न हो
इस उत्तर
में आप इस प्रक्रिया के लिए एक कोड उदाहरण पा सकते हैं (DbContext
. का उपयोग करके) )।