आप निम्न कोड के साथ समवर्ती समस्या को कैसे हल करेंगे? इस उदाहरण में, हम क्यों जानना चाहते हैं उपयोगकर्ता प्रमाणीकरण विफल रहा। समस्या यह है कि यह कोड डेटाबेस में दो अलग-अलग कॉल करता है, लेकिन हम एक वैचारिक लेनदेन के अंदर पूरी विधि को करना चाहते हैं। विशेष रूप से हम isolation में रूचि रखते हैं। हम प्रमाणीकरण विफलता के कारण को निर्धारित करने से पहले हमारे पढ़ने को प्रभावित करने के लिए इस विधि के निष्पादन के दौरान समवर्ती लिखना नहीं चाहते हैं।एकाधिक, स्वतंत्र डेटाबेस लेनदेन के साथ Concurrency मुद्दों?
कुछ समाधान दिमाग में आते हैं: Thread Locking, TransactionScope और Optimistic Locking। मुझे वास्तव में आशावादी लॉकिंग का विचार पसंद है, क्योंकि मुझे लगता है कि संघर्ष दुर्लभ होने की संभावना है, लेकिन ऐसा करने के लिए .NET में कुछ भी नहीं बनाया गया है, है ना?
इसके अलावा - क्या इस मामले में वास्तव में इस बारे में चिंतित होना कुछ है? जब इस पर विचार करने के लिए इस तरह के महत्वपूर्ण मुद्दे हैं और वे कब नहीं हैं? समाधान को लागू करने के लिए क्या विचार किया जाना चाहिए? प्रदर्शन? ताला की अवधि? विवादों की संभावना कितनी है?
संपादित करें: Aristos 'जवाब समीक्षा करने के बाद, मुझे लगता है कि मैं क्या कर रहा हूँ वास्तव में के बाद "snapshot" प्रमाणित विधि के लिए अलगाव स्तर के कुछ प्रकार है।
public MembershipStatus Authenticate(string username, string password)
{
MembershipUser user = Membership.GetUser(username);
if (user == null)
{
// user did not exist as of Membership.GetUser
return MembershipStatus.InvalidUsername;
}
if (user.IsLockedOut)
{
// user was locked out as of Membership.GetUser
return MembershipStatus.AccountLockedOut;
}
if (Membership.ValidateUser(username, password))
{
// user was valid as of Membership.ValidateUser
return MembershipStatus.Valid;
}
// user was not valid as of Membership.ValidateUser BUT we don't really
// know why because we don't have ISOLATION. The user's status may have changed
// between the call to Membership.GetUser and Membership.ValidateUser.
return MembershipStatus.InvalidPassword;
}
mutex
मुझे यकीन है कि तुम सच में अलगाव के बारे में यहाँ चिंता करने की जरूरत नहीं है। 'GetUser' और' ValidateUser' 'पर कॉल के बीच उपयोगकर्ता को हटा दिया जाएगा या लॉक हो जाने की संभावना क्या है? और इस बिंदु पर, आपको इस जानकारी को उपयोगकर्ता को किसी भी तरह से उजागर नहीं करना चाहिए। यदि आप "गलत पासवर्ड" बनाम "उपयोगकर्ता मौजूद नहीं हैं" बनाम "खाता लॉक आउट" के लिए अलग-अलग संदेश दिखाते हैं, तो कोई भी व्यक्ति आपकी साइट हैक करने का प्रयास कर रहा है, वह वैध उपयोगकर्ता नामों की सूची प्राप्त करने के लिए उस जानकारी का लाभ उठा सकता है।आप यह नहीं चाहते हैं, क्योंकि उन उपयोगकर्ता नाम आपके बुनियादी ढांचे में कुछ अन्य भेद्यता का शोषण करने में सहायक हो सकते हैं। प्रतिक्रिया के लिए –
+1। मैंने शायद यहां एक खराब उदाहरण का उपयोग किया है (हालांकि मैं "अवैध प्रमाण-पत्र" और "खाता लॉक आउट" के बीच अंतर करने की योजना बना रहा था और शायद मुझे उस पर पुनर्विचार करना होगा)। मुझे बस इस तथ्य को पसंद नहीं है कि डेटा मेरे नीचे बदल सकता है! Concurrency मुश्किल है! क्या होगा यदि मुझे डेटा को लगातार बनाए रखने की आवश्यकता है, तो आप क्या सुझाव देंगे? इस प्रश्न का उत्तर देने और सत्र की जानकारी के लिए समय लेने के लिए – Brandon