जवाबों:
यह अलगाव स्तर गंदे रीड्स की अनुमति देता है। एक लेन-देन में कुछ अन्य लेन-देन द्वारा किए गए परिवर्तन नहीं हो सकते हैं।
अलगाव के उच्चतम स्तर को बनाए रखने के लिए, एक डीबीएमएस आमतौर पर डेटा पर ताले प्राप्त करता है, जिसके परिणामस्वरूप संक्षिप्तता का नुकसान हो सकता है और एक उच्च लॉकिंग ओवरहेड हो सकता है। यह अलगाव स्तर इस संपत्ति को आराम देता है।
आप कुछ उदाहरणों और आगे पढ़ने के लिए विकिपीडिया लेखREAD UNCOMMITTED
को देखना चाहेंगे ।
आपको जेफ एटवुड के ब्लॉग लेख की जांच करने में भी रुचि हो सकती है कि कैसे और उनकी टीम ने स्टैक ओवरफ्लो के शुरुआती दिनों में एक गतिरोध मुद्दे से निपट लिया। जेफ के अनुसार:
लेकिन
nolock
खतरनाक है? क्या आप इसके साथ अमान्य डेटा पढ़ना समाप्त कर सकते हैंread uncommitted
? हाँ, सिद्धांत रूप में। आपको डेटाबेस आर्किटेक्चर के अंतरिक्ष यात्रियों की कोई कमी नहीं मिलेगी जो आप और सभी पर ACID विज्ञान छोड़ना शुरू करते हैं, लेकिन बिल्डिंग फायर अलार्म को खींचते हैं जब आप उन्हें बताते हैं कि आप कोशिश करना चाहते हैंnolock
। यह सच है: सिद्धांत डरावना है। लेकिन यहाँ मैं क्या सोचता हूँ: "सिद्धांत रूप में सिद्धांत और व्यवहार में कोई अंतर नहीं है। व्यवहार में है।"मैं
nolock
एक सामान्य "क्या आप के लिए अच्छा है" के रूप में उपयोग करने की अनुशंसा नहीं करेंगे आप साँप के तेल को किसी भी डेटाबेस डेडलॉकिंग समस्याओं के लिए ठीक कर सकते हैं। आपको समस्या के स्रोत का निदान करने का प्रयास करना चाहिए।लेकिन
nolock
उन प्रश्नों को जोड़ने के अभ्यास में, जिन्हें आप पूरी तरह से जानते हैं, सरल हैं, सीधे-सीधे पढ़े जाने वाले केवल मामले ही समस्याएँ पैदा नहीं करते हैं ... जब तक आप जानते हैं कि आप क्या कर रहे हैं।
READ UNCOMMITTED
आप जिस स्तर पर विचार करना चाहते हैं, उसका एक विकल्प है READ COMMITTED SNAPSHOT
। जेफ को फिर से उद्धृत करते हुए:
स्नैपशॉट्स पूरी तरह से नए डेटा परिवर्तन ट्रैकिंग विधि पर निर्भर करते हैं ... सिर्फ एक मामूली तार्किक परिवर्तन से अधिक, यह सर्वर को शारीरिक रूप से अलग तरीके से डेटा को संभालने की आवश्यकता है। एक बार जब यह नया डेटा परिवर्तन ट्रैकिंग विधि सक्षम हो जाता है, तो यह हर डेटा परिवर्तन की प्रतिलिपि या स्नैपशॉट बनाता है। विवाद के समय लाइव डेटा के बजाय इन स्नैपशॉट्स को पढ़ने से, साझा किए गए ताले को रीड्स की आवश्यकता नहीं होती है, और समग्र डेटाबेस प्रदर्शन बढ़ सकता है।
READ UNCOMMITTED
आप दो बार पंक्तियों को पढ़ने या संपूर्ण पंक्तियों को याद करने का कारण बन सकते हैं । यदि आप पढ़ते समय पेज-स्प्लिट होते हैं, तो आप डेटा के पूरे हिस्से को याद कर सकते हैं। WITH(NOLOCK)
यदि परिणाम की सटीकता महत्वपूर्ण नहीं है, तो केवल इसका उपयोग किया जाना चाहिए
यह लंबे आवेषण प्रश्नों की प्रगति को देखने के लिए उपयोगी हो सकता है, कोई भी अनुमान लगा सकते हैं (जैसे COUNT(*)
या मोटा SUM(*)
) आदि।
दूसरे शब्दों में, गंदे पढ़े गए प्रश्नों के परिणाम तब तक ठीक होते हैं जब तक आप उन्हें अनुमान के रूप में मानते हैं और उनके आधार पर कोई महत्वपूर्ण निर्णय नहीं लेते हैं।
के लिए मेरा पसंदीदा उपयोग मामला read uncommited
एक लेनदेन के अंदर होने वाली किसी चीज़ को डीबग करना है।
अपना सॉफ़्टवेयर किसी डिबगर के अंतर्गत प्रारंभ करें, जब आप कोड की पंक्तियों के माध्यम से आगे बढ़ रहे हैं, तो यह एक लेनदेन खोलता है और आपके डेटाबेस को संशोधित करता है। जब कोड बंद कर दिया जाता है, तो आप एक क्वेरी एनालाइज़र खोल सकते हैं, रीड अनक्मिटेड आइसोलेशन लेवल पर सेट कर सकते हैं और देख सकते हैं कि क्या चल रहा है।
आप यह देखने के लिए भी उपयोग कर सकते हैं कि लंबे समय से चल रही प्रक्रियाएँ अटकी हुई हैं या अपने डेटाबेस को सही ढंग से अपडेट कर रही हैं।
यह बहुत अच्छा है यदि आपकी कंपनी अत्यधिक जटिल संग्रहीत प्रक्रियाओं को बनाना पसंद करती है।
फायदा यह है कि यह कुछ स्थितियों में तेज हो सकता है। नुकसान यह है कि परिणाम गलत हो सकता है (डेटा जो अभी तक प्रतिबद्ध नहीं हुआ है उसे वापस किया जा सकता है) और इस बात की कोई गारंटी नहीं है कि परिणाम दोहराए जाने योग्य है।
यदि आप सटीकता की परवाह करते हैं, तो इसका उपयोग न करें।
अधिक जानकारी MSDN पर है :
गंदे पढ़ने, या अलगाव स्तर 0 लॉकिंग, जिसका अर्थ है कि कोई साझा ताले जारी नहीं किए गए हैं और कोई विशेष ताले सम्मानित नहीं किए गए हैं। जब यह विकल्प सेट हो जाता है, तो बिना पढ़े या गंदे डेटा पढ़ना संभव है; डेटा के मूल्यों को बदला जा सकता है और लेनदेन के अंत से पहले डेटा सेट में पंक्तियाँ दिखाई या गायब हो सकती हैं। लेन-देन में सभी SELECT स्टेटमेंट्स में सभी तालिकाओं पर NOLOCK सेट करने के रूप में इस विकल्प का एक ही प्रभाव है। यह चार अलगाव स्तरों में से सबसे कम प्रतिबंधात्मक है।
select
बयानों को उन संसाधनों पर साझा ताले प्राप्त करने के लिए इंतजार नहीं करना होगा जो विशेष रूप से अन्य लेनदेन द्वारा बंद हैं।
कब उपयोग करना ठीक है READ UNCOMMITTED
?
अच्छा : बड़े कुल रिपोर्ट लगातार बदलते योग दिखा रहे हैं।
जोखिम भरा : लगभग सब कुछ।
अच्छी खबर यह है कि केवल पढ़ी जाने वाली अधिकांश रिपोर्टें उस अच्छी श्रेणी में आती हैं ।
इसका उपयोग करने के लिए ठीक है:
SSRS कहते हैं कि बिजनेस इंटेलिजेंस डिपार्टमेंट का अधिकांश हिस्सा शायद ही इसमें शामिल होता है। बेशक, इसके सामने $ संकेतों के साथ कुछ भी है। बहुत से लोग ग्राहक की सेवा और उस पैसे को उत्पन्न करने के लिए आवश्यक संबंधित कोर मैट्रिक्स पर लागू होने की तुलना में बहुत अधिक उत्साह के साथ खाते में हैं। (मैं अकाउंटेंट्स को दोष देता हूं)।
जब जोखिम भरा हो
कोई भी रिपोर्ट जो विस्तार स्तर तक जाती है। यदि उस विवरण की आवश्यकता है तो आमतौर पर इसका अर्थ है कि हर पंक्ति किसी निर्णय के लिए प्रासंगिक होगी। वास्तव में, यदि आप एक छोटे से उप-समूह को अवरुद्ध किए बिना नहीं खींच सकते हैं तो यह उस अच्छे कारण के लिए हो सकता है जिसे वर्तमान में संपादित किया जा रहा है।
ऐतिहासिक आंकड़ा। यह शायद ही कभी व्यावहारिक अंतर बनाता है, लेकिन जब उपयोगकर्ता समझते हैं कि लगातार बदलते हुए डेटा सही नहीं हो सकते हैं, तो वे स्थैतिक डेटा के बारे में समान महसूस नहीं करते हैं। डर्टी रीड्स यहाँ चोट नहीं करेगा, लेकिन डबल रीड कभी-कभार हो सकता है। यह देखते हुए कि आपके पास स्थिर डेटा पर वैसे भी ब्लॉक नहीं होना चाहिए, यह जोखिम क्यों है?
लगभग कुछ भी जो एक एप्लिकेशन को फीड करता है जिसमें लेखन क्षमता भी होती है।
जब भी ठीक परिदृश्य ठीक नहीं है।
NOLOCK
उन तालिकाओं पर किसी भी चीज़ के लिए उपयोग नहीं कर सकते ।read uncommitted
वेब अनुप्रयोगों के लिए उपयोग करना चाहिए जब उपयोगकर्ता कुछ यूआई ग्रिड देखता है जहां डेटा सटीकता इतनी महत्वपूर्ण नहीं है। उपयोगकर्ता बस एक त्वरित अवलोकन चाहता है कि क्या रिकॉर्ड हो सकता है, और शायद कुछ पेजिंग, छँटाई और छानने के साथ। केवल जब उपयोगकर्ता एडिट बटन पर क्लिक करता है, तो मैं अधिक सख्त आइसोलेशन स्तर के साथ सबसे वर्तमान रिकॉर्ड को पढ़ने की कोशिश करता हूं। क्या प्रदर्शन के मामले में ऐसा दृष्टिकोण बेहतर नहीं होना चाहिए?
select item from things with (UPDLOCK)
। वहाँ एक त्वरित मध्यांतर रखो ताकि अगर यह ताला तेजी से प्राप्त नहीं कर सके तो यह उपयोगकर्ता को यह बताता है कि इसे संपादित किया जा रहा है। यह न केवल उपयोगकर्ताओं बल्कि डेवलपर्स से आपको सुरक्षित रखेगा। केवल यहाँ समस्या है आपको टाइमआउट के बारे में सोचना शुरू करना होगा और आप इसे यूआई में कैसे संभाल सकते हैं।
रिपोर्टिंग के बारे में, हम अपने सभी क्वेरीज़ डेटाबेस पर क्वेरी को रोकने से रोकने के लिए इसका उपयोग करते हैं। हम ऐसा कर सकते हैं क्योंकि हम ऐतिहासिक डेटा खींच रहे हैं, अप-टू-माइक्रोसेकंड डेटा नहीं।
READ_UNCOMMITTED का उपयोग उस स्थिति में करें जब स्रोत बदलने की अत्यधिक संभावना नहीं है।
जब आप जानते हैं कि READ_UNCOMMITTED का उपयोग न करें तो आपको पता चल जाएगा कि भ्रूण का ऑपरेशन के दौरान परिवर्तन हो सकता है।
READ UNCOMMITTED
।
READ UNCOMMITTED
परिस्थितियों में सबसे अधिक लाभ उठा सकते हैं जब आपका डेटा सक्रिय रूप से उपयोग किया जा रहा हो और आप संभावित गतिरोधों और लेन-देन रोलबैक से बचने के लिए सर्वर पर लोड को कम करना चाहते हैं, क्योंकि कुछ उपयोगकर्ता जहां लापरवाह हो रहे हैं " डेटाग्रिड के साथ एक वेब पेज में "ताज़ा करें" बटन। जो उपयोगकर्ता एक ही समय में रिकॉर्ड का एक गुच्छा देखते हैं, आमतौर पर अगर डेटा थोड़ा पुराना या आंशिक रूप से अपडेट किया जाता है, तो बहुत परवाह नहीं करता है। केवल जब कोई उपयोगकर्ता किसी रिकॉर्ड को संपादित करने वाला होता है, तब आप उसे सबसे सटीक डेटा देना चाहते हैं।
यह आपको गंदे रीड देगा, और आपको लेनदेन दिखाएगा जो अभी तक प्रतिबद्ध नहीं है। यह सबसे स्पष्ट जवाब है। मुझे नहीं लगता कि इसका उपयोग करने के लिए एक अच्छा विचार है कि यह सिर्फ आपके रीड्स को गति प्रदान करे। ऐसा करने के अन्य तरीके हैं यदि आप एक अच्छे डेटाबेस डिज़ाइन का उपयोग करते हैं।
यह भी दिलचस्प है कि क्या नहीं हो रहा है ध्यान दें। READ UNCOMMITTED न केवल अन्य तालिका तालों को अनदेखा करता है। यह भी अपने आप में कोई ताले पैदा नहीं कर रहा है।
विचार करें कि आप एक बड़ी रिपोर्ट तैयार कर रहे हैं, या आप एक बड़े और संभवतः जटिल चयन कथन का उपयोग करके अपने डेटाबेस से डेटा को माइग्रेट कर रहे हैं। यह एक साझा लॉक का कारण होगा जो आपके लेन-देन की अवधि के लिए साझा टेबल लॉक तक बढ़ाया जा सकता है। अन्य लेनदेन तालिका से पढ़ सकते हैं, लेकिन अपडेट असंभव हैं। यह एक बुरा विचार हो सकता है अगर इसका उत्पादन डेटाबेस पूरी तरह से बंद हो जाए।
यदि आप READ UNCOMMITTED का उपयोग कर रहे हैं तो आप टेबल पर साझा लॉक सेट नहीं करेंगे। आपको कुछ नए लेन-देन से परिणाम मिल सकता है या हो सकता है कि यह इस बात पर निर्भर न करे कि डेटा कहाँ डाला गया था और आपके SELECT लेन-देन को कितने समय तक पढ़ा है। उदाहरण के लिए पेज स्प्लिट होने पर आपको दो बार एक ही डेटा मिल सकता है (डेटा फ़ाइल में डेटा किसी अन्य स्थान पर कॉपी किया जाएगा)।
इसलिए, यदि आपके लिए यह बहुत महत्वपूर्ण है कि डेटा को आपके SELECT करते समय डाला जा सकता है, तो READ UNCOMMITTED का अर्थ हो सकता है। आपको यह विचार करना होगा कि आपकी रिपोर्ट में कुछ त्रुटियां हो सकती हैं, लेकिन अगर लाखों पंक्तियों के आधार पर और उनमें से केवल कुछ को अपडेट किया जाता है, तो परिणाम का चयन करते समय यह "काफी अच्छा" हो सकता है। एक पंक्ति की विशिष्टता की गारंटी नहीं दी जा सकती क्योंकि आपका लेनदेन सभी एक साथ विफल हो सकता है।
एक बेहतर तरीका पूरी तरह से स्नैपशॉट अलगाव स्तर का उपयोग करने के लिए हो सकता है लेकिन आपके अनुप्रयोगों को इसका उपयोग करने के लिए कुछ समायोजन की आवश्यकता हो सकती है। इसका एक उदाहरण यह है कि यदि आपका एप्लिकेशन दूसरों को पढ़ने से रोकने के लिए एक पंक्ति में अनन्य लॉक लेता है और UI में संपादन मोड में जाता है। SNAPSHOT अलगाव स्तर भी एक काफी प्रदर्शन जुर्माना (विशेष रूप से डिस्क पर) के साथ आता है। लेकिन आप उस समस्या पर हार्डवेयर को फेंक कर दूर कर सकते हैं। :)
डेटा में रिपोर्टिंग या लोडिंग डेटा के लिए उपयोग करने के लिए आप डेटाबेस का बैकअप बहाल करने पर भी विचार कर सकते हैं।
मैं हमेशा अब READ UNCOMMITTED का उपयोग करता हूं। यह कम से कम मुद्दों के साथ तेज है। अन्य अलगाव का उपयोग करते समय आप लगभग हमेशा कुछ अवरोधक मुद्दों पर आएंगे।
जब तक आप Auto Increment फ़ील्ड्स का उपयोग करते हैं और आवेषण पर थोड़ा अधिक ध्यान देते हैं तब तक आपका ठीक है, और आप अवरुद्ध समस्याओं को अलविदा कह सकते हैं।
आप READ UNCOMMITED के साथ त्रुटियां कर सकते हैं लेकिन ईमानदार होने के लिए, यह बहुत आसान है सुनिश्चित करें कि आपके आवेषण पूर्ण प्रमाण हैं। एक चयन से परिणाम का उपयोग करने वाले आवेषण / अपडेट केवल एक चीज है जिसे आपको देखने की आवश्यकता है। (यहां पढ़ी गई टिप्पणी का उपयोग करें, या यह सुनिश्चित करें कि गंदे रीड किसी समस्या का कारण नहीं हैं)
तो डर्टी रीड्स (विशेष रूप से बड़ी रिपोर्टों के लिए) पर जाएं, आपका सॉफ़्टवेयर सुचारू रूप से चलेगा ...
Committed
आवेषण और अद्यतन के लिए स्विच करेगा । अन्य समस्याओं के रूप में उन्होंने ऑटो-इंक्रीमेंट कुंजी का उपयोग करते हुए पृष्ठ-विभाजन के मुद्दों के बारे में जागरूकता का प्रदर्शन किया। मैं उनसे सहमत हूँ कि लगभग सभी मानव मात्र द्वारा पढ़ी जाने वाली लाइव रिपोर्टिंग अंतिम दशमलव स्थान में मामूली विसंगतियों को सहन कर सकती है। मैं सहमत हूँ कि यह विस्तृत लिस्टिंग या डेटा के लिए एक अलग कहानी है जिसे मशीन को पढ़ना और बदलना है और इसलिए क्लाइव।