लॉक कर रहा है मैं एक एडीओ.NET आधारित वेब साइट बनाने वाली टीम का हिस्सा हूं। कभी-कभी हमारे पास कई डेवलपर्स और एक स्वचालित परीक्षण उपकरण होता है जो डेटाबेस की विकास प्रति एक साथ काम करता है।अलगाव लेवल का उपयोग करना। स्नैपशॉट लेकिन डीबी अभी भी
हम स्नैपशॉट अलगाव स्तर का उपयोग करते हैं, जो कि मेरे ज्ञान का सबसे अच्छा है, आशावादी समरूपता का उपयोग करता है: लॉक करने के बजाए, यह सबसे अच्छा उम्मीद करता है और यदि आप प्रभावित लेन को बदलते हैं तो लेनदेन करने का प्रयास करते हैं तो अपवाद फेंकता है लेनदेन के दौरान एक और पार्टी द्वारा।
स्नैपशॉट अलगाव स्तर का उपयोग करने के लिए हम का उपयोग करें:
ALTER DATABASE <database name>
SET ALLOW_SNAPSHOT_ISOLATION ON;
और में सी #:
Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot);
ध्यान दें कि IsolationLevel स्नैपशॉट ReadCommitted स्नैपशॉट है, जो हम भी कोशिश की है के रूप में ही नहीं है, लेकिन वर्तमान में उपयोग नहीं कर रहे हैं।
जब कोई डेवलपर डीबग मोड में प्रवेश करता है और .NET ऐप को रोकता है, तो वह डिबगिंग के दौरान सक्रिय लेनदेन के साथ कनेक्शन रखेगा। अब, मैं उम्मीद करता हूं कि यह कोई समस्या न हो - आखिरकार, सभी लेन-देन स्नैपशॉट अलगाव स्तर का उपयोग कर रहे हैं, इसलिए एक लेनदेन रुक गया है, जबकि अन्य लेनदेन सामान्य रूप से आगे बढ़ने में सक्षम होना चाहिए क्योंकि रोके गए लेनदेन में कोई ताला नहीं है। बेशक, जब विरामित लेनदेन पूरा हो जाता है, तो यह एक संघर्ष का पता लगाने की संभावना है; लेकिन यह तब तक स्वीकार्य है जब तक अन्य डेवलपर्स और स्वचालित परीक्षण बिना किसी आगे बढ़ सकते हैं।
हालांकि, व्यावहारिक रूप से, जब एक व्यक्ति डीबगिंग के दौरान लेनदेन को रोकता है, तो स्नैपशॉट अलगाव स्तर का उपयोग करने के बावजूद एक ही पंक्तियों तक पहुंचने का प्रयास करने वाले अन्य सभी डीबी उपयोगकर्ता अवरुद्ध होते हैं।
क्या कोई जानता है कि ऐसा क्यों होता है, और/या मैं कैसे सच आशावादी (गैर-अवरुद्ध) समवर्तीता प्राप्त कर सकता हूं?
संकल्प (मेरे लिए एक दुर्भाग्यपूर्ण एक): Remus Rusanu ने कहा कि लेखकों हमेशा अन्य लेखकों रोक सकता है; यह MSDN द्वारा समर्थित है - यह काफी बाहर नहीं आता है और ऐसा कहता है, लेकिन केवल पाठक-लेखक ताले से बचने का उल्लेख करता है। संक्षेप में, मैं चाहता हूं कि व्यवहार SQL सर्वर में लागू नहीं किया गया है।
यह व्यवहार उत्पादन में असंभव है। दूसरी ओर, विकास संस्करण काफी महत्वपूर्ण है, और यदि विकास को सुचारू बनाता है तो मैं कोड परिवर्तन करने के लिए तैयार हूं। दुर्भाग्यवश, लॉकिंग की एक "svn-esque" शैली (सर्वोत्तम के लिए आशा और केवल संघर्ष पर असफल) लागू नहीं लगती है। सभी छोटे लेनदेन को अवरुद्ध किए बिना लंबे समय से चलने वाले और जटिल लेन-देन की क्षमता अभी भी उपयोगी होगी - जैसा कि हम अवरुद्ध होने से बचने के लिए आदर्श लेन-देन का उपयोग करते हैं। –
कोई चांदी की बुलेट नहीं है। लेकिन अगर आप खुद को अक्सर बनाम लिखने में अवरुद्ध पाते हैं, तो आपको यह समझना चाहिए कि ऐसा क्यों हो रहा है, अलग-अलग 'अनुरोध' एक ही डेटा के अपडेट क्यों करते हैं। शायद आप अपने आवेदन को बेहतर तरीके से विभाजित कर सकते हैं, ओवरलैप की संभावना कम कर सकते हैं। शायद कुछ अपडेट को स्थगित कर दिया जा सकता है, उपयोगकर्ता लेनदेन के दौरान एक कार्य तालिका में लगाया जाता है (एनक्यू/डेक्यू को देखभाल के साथ ब्लॉक मुक्त किया जा सकता है) और बाद में समर्पित बैच प्रक्रियाओं द्वारा संसाधित किया जा सकता है। यह भी सुनिश्चित करें कि सभी लेन-देन केवल न्यूनतम आवश्यक लॉक करें (कोई पृष्ठ/तालिका ताले, कोई वृद्धि नहीं, कोई व्यर्थ तालिका स्कैन नहीं)। –