2009-06-25 12 views
7

लॉक कर रहा है मैं एक एडीओ.NET आधारित वेब साइट बनाने वाली टीम का हिस्सा हूं। कभी-कभी हमारे पास कई डेवलपर्स और एक स्वचालित परीक्षण उपकरण होता है जो डेटाबेस की विकास प्रति एक साथ काम करता है।अलगाव लेवल का उपयोग करना। स्नैपशॉट लेकिन डीबी अभी भी

हम स्नैपशॉट अलगाव स्तर का उपयोग करते हैं, जो कि मेरे ज्ञान का सबसे अच्छा है, आशावादी समरूपता का उपयोग करता है: लॉक करने के बजाए, यह सबसे अच्छा उम्मीद करता है और यदि आप प्रभावित लेन को बदलते हैं तो लेनदेन करने का प्रयास करते हैं तो अपवाद फेंकता है लेनदेन के दौरान एक और पार्टी द्वारा।

स्नैपशॉट अलगाव स्तर का उपयोग करने के लिए हम का उपयोग करें:

ALTER DATABASE <database name> 
SET ALLOW_SNAPSHOT_ISOLATION ON; 

और में सी #:

Transaction = SqlConnection.BeginTransaction(IsolationLevel.Snapshot); 

ध्यान दें कि IsolationLevel स्नैपशॉट ReadCommitted स्नैपशॉट है, जो हम भी कोशिश की है के रूप में ही नहीं है, लेकिन वर्तमान में उपयोग नहीं कर रहे हैं।

जब कोई डेवलपर डीबग मोड में प्रवेश करता है और .NET ऐप को रोकता है, तो वह डिबगिंग के दौरान सक्रिय लेनदेन के साथ कनेक्शन रखेगा। अब, मैं उम्मीद करता हूं कि यह कोई समस्या न हो - आखिरकार, सभी लेन-देन स्नैपशॉट अलगाव स्तर का उपयोग कर रहे हैं, इसलिए एक लेनदेन रुक गया है, जबकि अन्य लेनदेन सामान्य रूप से आगे बढ़ने में सक्षम होना चाहिए क्योंकि रोके गए लेनदेन में कोई ताला नहीं है। बेशक, जब विरामित लेनदेन पूरा हो जाता है, तो यह एक संघर्ष का पता लगाने की संभावना है; लेकिन यह तब तक स्वीकार्य है जब तक अन्य डेवलपर्स और स्वचालित परीक्षण बिना किसी आगे बढ़ सकते हैं।

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

क्या कोई जानता है कि ऐसा क्यों होता है, और/या मैं कैसे सच आशावादी (गैर-अवरुद्ध) समवर्तीता प्राप्त कर सकता हूं?

संकल्प (मेरे लिए एक दुर्भाग्यपूर्ण एक): Remus Rusanu ने कहा कि लेखकों हमेशा अन्य लेखकों रोक सकता है; यह MSDN द्वारा समर्थित है - यह काफी बाहर नहीं आता है और ऐसा कहता है, लेकिन केवल पाठक-लेखक ताले से बचने का उल्लेख करता है। संक्षेप में, मैं चाहता हूं कि व्यवहार SQL सर्वर में लागू नहीं किया गया है।

उत्तर

8

स्नैपशॉट isolation स्तर सभी अलगाव स्तरों की तरह प्रभावित करता है, केवल पढ़ता है। लेखन अभी भी एक-दूसरे को अवरुद्ध कर रहे हैं। यदि आप मानते हैं कि जो आप देखते हैं वह ब्लॉक पढ़े जाते हैं, तो आपको आगे की जांच करनी चाहिए और संसाधन प्रकारों और संसाधनों के नामों की जांच करनी चाहिए जिन पर अवरोध होता है (प्रतीक्षा_type और प्रतीक्षा करें = sys.dm_exec_requests में प्रतीक्षा करें।

मैं ऐसे परिदृश्य का समर्थन करने के लिए कोड परिवर्तन करने की सलाह नहीं दूंगा जिसमें डेवलपर्स अंत में मिनटों के लिए डीबगर पर देख रहे हों। यदि आप मानते हैं कि यह परिदृश्य उत्पादन में दोहराया जा सकता है (यानी क्लाइंट लटकता है) तो एक अलग कहानी है। आप जो चाहते हैं उसे प्राप्त करने के लिए आपको लिखना कम करना चाहिए और लेनदेन के अंत में सभी लिखना चाहिए, एक ही कॉल में जो रिटर्न से पहले करता है। इस तरह कोई क्लाइंट लंबे समय तक एक्स लॉक को पकड़ नहीं सकता है (एक्स ताले रखने के दौरान लटका नहीं सकता है)। व्यावहारिक रूप से इसे खींचना बहुत कठिन होता है और डेवलपर्स के हिस्से पर बहुत से अनुशासन की आवश्यकता होती है कि वे डेटा एक्सेस कोड कैसे लिखते हैं।

+0

यह व्यवहार उत्पादन में असंभव है। दूसरी ओर, विकास संस्करण काफी महत्वपूर्ण है, और यदि विकास को सुचारू बनाता है तो मैं कोड परिवर्तन करने के लिए तैयार हूं। दुर्भाग्यवश, लॉकिंग की एक "svn-esque" शैली (सर्वोत्तम के लिए आशा और केवल संघर्ष पर असफल) लागू नहीं लगती है। सभी छोटे लेनदेन को अवरुद्ध किए बिना लंबे समय से चलने वाले और जटिल लेन-देन की क्षमता अभी भी उपयोगी होगी - जैसा कि हम अवरुद्ध होने से बचने के लिए आदर्श लेन-देन का उपयोग करते हैं। –

+1

कोई चांदी की बुलेट नहीं है। लेकिन अगर आप खुद को अक्सर बनाम लिखने में अवरुद्ध पाते हैं, तो आपको यह समझना चाहिए कि ऐसा क्यों हो रहा है, अलग-अलग 'अनुरोध' एक ही डेटा के अपडेट क्यों करते हैं। शायद आप अपने आवेदन को बेहतर तरीके से विभाजित कर सकते हैं, ओवरलैप की संभावना कम कर सकते हैं। शायद कुछ अपडेट को स्थगित कर दिया जा सकता है, उपयोगकर्ता लेनदेन के दौरान एक कार्य तालिका में लगाया जाता है (एनक्यू/डेक्यू को देखभाल के साथ ब्लॉक मुक्त किया जा सकता है) और बाद में समर्पित बैच प्रक्रियाओं द्वारा संसाधित किया जा सकता है। यह भी सुनिश्चित करें कि सभी लेन-देन केवल न्यूनतम आवश्यक लॉक करें (कोई पृष्ठ/तालिका ताले, कोई वृद्धि नहीं, कोई व्यर्थ तालिका स्कैन नहीं)। –

2

क्या आपने लॉक को देखा है जब कोई डेवलपर लेनदेन को रोकता है? साथ ही, स्नैपशॉट अलगाव स्तर को चालू करने पर बहुत अधिक प्रभाव नहीं पड़ता है। क्या आपने ALLOW_SNAPSHOT_ISOLATION चालू किया है? डेटाबेस

ALTER DATABASE <databasename> 
SET READ_COMMITTED_SNAPSHOT ON; 
GO 

ALTER DATABASE <database name> 
SET ALLOW_SNAPSHOT_ISOLATION ON; 
GO 

बाद स्नैपशॉट अलगाव, डेवलपर्स के लिए सक्षम किया गया है और उन तो अनुरोध करना होगा कि उन्हें लेन-देन इस स्नैपशॉट मोड में चलाया जा:

ये कदम उठाएँ। यह एक सौदे शुरू करने से पहले किया जाना चाहिए, या तो ADO.NET लेन-देन वस्तु पर एक क्लाइंट-साइड निर्देश या उनके Transact SQL क्वेरी के भीतर निम्न कथन का उपयोग करके:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT 

राज

+0

डेटाबेस पर allow_snapshot_isolation चालू है। ऐसा करने में विफलता तत्काल अपवाद में परिणाम देती है; जब आप allow_snapshot_isolation बंद हो जाते हैं तो आप isolationlevel को स्नैपशॉट पर सेट नहीं कर सकते हैं (यानी अलगाव स्तर सेट करना चुपचाप विफल नहीं होता है)। मैं आवश्यक सटीक आदेशों को प्रतिबिंबित करने के लिए पोस्ट अपडेट करूंगा, धन्यवाद! –

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