अगर कोई कहता है कि नोलोक के बिना उनका आवेदन हमेशा मृत हो जाता है, तो उनके प्रश्नों के साथ समस्या (संभावना से अधिक) होती है। डेडलॉक का अर्थ है कि दो लेनदेन संसाधन विवाद के कारण आगे नहीं बढ़ सकते हैं और समस्या का समाधान नहीं किया जा सकता है। एक उदाहरण:
लेनदेन ए और बी पर विचार करें दोनों उड़ान में हैं। लेनदेन ए ने तालिका एक्स में एक पंक्ति डाली है और लेनदेन बी ने तालिका वाई में एक पंक्ति डाली है, इसलिए लेनदेन ए के पास एक्स पर एक विशेष लॉक है और लेनदेन बी के पास वाई
पर एक विशेष लॉक है, अब लेनदेन ए की आवश्यकता है तालिका वाई के खिलाफ चयन करें और लेनदेन बी को तालिका X के खिलाफ एक चयन चलाने की आवश्यकता है।
दो लेनदेन मृतक हैं: एक संसाधन संसाधन वाई और बी को संसाधन एक्स की आवश्यकता है। चूंकि न तो लेनदेन आगे बढ़ने तक आगे बढ़ सकता है, इसलिए बैठना नहीं हो सकता हल किया गया: न तो संसाधन के लिए लेनदेन की मांग तब तक सब्सिडीकृत की जा सकती है जब तक अन्य लेनदेन विवाद में संसाधन पर लॉक जारी नहीं करता है (या तो रोलबैक या COMMIT द्वारा कोई फर्क नहीं पड़ता।)
एसक्यूएल सर्वर इस स्थिति की पहचान करता है और एक लेन-देन का चयन करता है या दूसरा डेडलॉक पीड़ित के रूप में चुनता है, जो लेनदेन और रोल वापस करता है, अन्य लेनदेन को अपने अनुमानित पूरा होने के लिए स्वतंत्र छोड़ देता है।
वास्तविक जीवन में डेडलॉक्स दुर्लभ हैं (आईएमएचओ)। एक से
- उन्हें rectifies सुनिश्चित करना है कि लेन-देन गुंजाइश संभव के रूप में छोटा है, कुछ एसक्यूएल सर्वर स्वचालित रूप से करता है, और
- सुनिश्चित करना है कि लेन-देन का उपयोग संसाधनों (SQL सर्वर के डिफ़ॉल्ट लेन-देन गुंजाइश COMMIT एक अंतर्निहित के साथ एक एकल बयान है) एक ही अनुक्रम में। उपर्युक्त उदाहरण में, यदि लेनदेन ए और बी दोनों एक ही अनुक्रम में संसाधन एक्स और वाई लॉक करते हैं, तो कोई डेडलॉक नहीं होगा।
टाइमआउट
टाइमआउट, दूसरे हाथ पर, जब एक सौदा इसकी प्रतीक्षा समय से अधिक है और संसाधन विवाद की वजह से वापस लुढ़का हुआ है होता है। उदाहरण के लिए, लेनदेन ए को संसाधन एक्स की आवश्यकता होती है। संसाधन एक्स को लेनदेन बी द्वारा बंद कर दिया जाता है, इसलिए लेनदेन ए लॉक जारी होने की प्रतीक्षा करता है। यदि लॉक टाइमआउट सीमा के भीतर लॉक जारी नहीं किया जाता है, तो प्रतीक्षा लेनदेन निरस्त हो जाता है और वापस लुढ़का जाता है। प्रत्येक क्वेरी में इसके साथ जुड़े एक क्वेरी टाइमआउट होता है (डिफ़ॉल्ट मान 30 है, मुझे विश्वास है), जिसके बाद लेनदेन निरस्त हो जाता है और वापस लुढ़का जाता है। क्वेरी टाइमआउट 0s पर सेट किया जा सकता है, इस स्थिति में SQL सर्वर क्वेरी को हमेशा के लिए प्रतीक्षा करने देगा।
शायद यही वह बात है जिसके बारे में वे बात कर रहे हैं। मेरे अनुभव में, इस तरह के टाइमआउट आमतौर पर बड़े डेटाबेस में होते हैं जब बड़ी बैच नौकरियां एक ही लेनदेन में हजारों और हजारों रिकॉर्ड अपडेट कर रही हैं, हालांकि वे ऐसा कर सकते हैं क्योंकि एक लेनदेन लंबा हो जाता है (क्वेरी एबलाइज़र में अपने उत्पादन डेटाबेस से कनेक्ट करें, BEGIN निष्पादित करें ट्रांज़ेक्शन, क्वेरी विश्लेषक में अक्सर हिट टेबल में एक पंक्ति को अपडेट करें और रोलबैक या कम्युनिकेशन ट्रांज़ेक्शन निष्पादित किए बिना दोपहर के भोजन पर जाएं और देखें कि उत्पादन डीबीए आपके लिए एपीएस ** टी पर कितना समय लेता है। यदि आपका है कि क्या करने जा रहा है, बस: कैसे मैं यह जानता हूँ मुझे मत पूछो)
टाइमआउट इस तरह की है NOLOCK के सभी प्रकार के साथ पूरी तरह से निर्दोष एसक्यूएल splattering में आम तौर पर क्या परिणाम
[टिप संकेत एसईटी ट्रांज़ेक्शन इशोलेशन लेवल को अपने संग्रहीत प्रक्रिया में पहले बयान के रूप में प्रस्तुत किया गया है और इसके साथ किया गया है।]
इस दृष्टिकोण के साथ समस्या (NOLOCK/पढ़ा गया अनौपचारिक) यह है कि आप अन्य लेनदेन से असामान्य डेटा पढ़ सकते हैं: सामान अधूरा है या जो बाद में लुढ़का हो सकता है, इसलिए आपकी डेटा अखंडता संचित है। आप उच्च स्तर की बोगोसिटी वाले डेटा के आधार पर एक बिल भेज रहे हैं।
मेरा सामान्य नियम यह है कि किसी को यथासंभव तालिका संकेतों के उपयोग से बचना चाहिए। एसक्यूएल सर्वर और इसके क्वेरी ऑप्टिमाइज़र को अपनी नौकरियां करने दें।
इस तरह के मुद्दे से बचने का सही तरीका लेनदेन के प्रकार से बचने के लिए है (उदाहरण के लिए एक लाख पंक्तियों में से एक को झुकाव), जिससे समस्याएं उत्पन्न होती हैं। रिलेशनल डेटाबेस एसक्यूएल में निहित लॉकिंग रणनीति को लघु दायरे के छोटे लेन-देन के आसपास डिज़ाइन किया गया है। लॉक स्कोप में छोटा होना चाहिए और अवधि में कम होना चाहिए। सोचें "बैंक टेलर किसी के चेकिंग खाते को जमा के साथ अपडेट कर रहा है।" अंतर्निहित उपयोग के मामले के रूप में। अपनी प्रक्रियाओं को उस मॉडल में काम करने के लिए डिज़ाइन करें और आप सभी तरह के दौर में ज्यादा खुश रहेंगे।
एक मोन्डो सम्मिलित कथन में दस लाख पंक्तियों को डालने के बजाय, स्वतंत्र भाग में काम करें और स्वतंत्र रूप से प्रत्येक खंड को प्रतिबद्ध करें। यदि 999,000 पंक्तियों को संसाधित करने के बाद आपकी मिलियन पंक्ति सम्मिलित हो जाती है, तो पूरा काम खो जाता है (उल्लेख नहीं है कि रोलबैक अब * टीएच हो सकता है, और तालिका अभी भी रोलबैक के दौरान बंद है।) यदि आप ब्लॉक में लाखों पंक्तियां डालते हैं प्रत्येक ब्लॉक के बाद प्रत्येक 1000 पंक्तियों में से प्रत्येक, आप लॉक विवाद से बचते हैं जो डेडलॉक्स का कारण बनता है, क्योंकि ताले प्राप्त किए जाएंगे और जारी किए जाएंगे और चीजें आगे बढ़ती रहेंगी। यदि 1000 पंक्तियों के 99 9 वें ब्लॉक में कुछ दक्षिण में जाता है, और लेनदेन निरस्त हो जाता है और वापस लुढ़का जाता है, तो आपको अभी भी 998,000 पंक्तियां मिलती हैं; आपने केवल काम की 1000 पंक्तियां खो दी हैं। पुनरारंभ/पुनः प्रयास करना बहुत आसान है।
इसके अलावा, बड़े लेनदेन में वृद्धि को लॉक करना होता है। दक्षता के लिए, लेन-देन बढ़ने वाले ताले की संख्या के रूप में ताले बड़े और बड़े दायरे में बढ़ते हैं। यदि एक लेनदेन एक तालिका में एक पंक्ति को सम्मिलित/अद्यतन/हटा देता है, तो मुझे एक पंक्ति लॉक मिलता है। ऐसा करते रहें और उस तालिका के विरुद्ध उस लेनदेन द्वारा रखे गए पंक्ति ताले की संख्या एक थ्रेसहोल्ड मान हिट करे, SQL सर्वर लॉकिंग रणनीति को आगे बढ़ाएगा: पंक्ति ताले को समेकित किया जाएगा और एक छोटे नंबर वाले पृष्ठ ताले में परिवर्तित किया जाएगा, इस प्रकार दायरे में वृद्धि होगी ताले लगाए गए। उस बिंदु से आगे, एक पंक्ति के एक सम्मिलित/हटा/अद्यतन तालिका में उस पृष्ठ को लॉक कर देगा। एक बार जब पेज लॉक की संख्या उसके थ्रेसहोल्ड वैल्यू को हिट करती है, तो पृष्ठ लॉक को फिर से समेकित किया जाता है और लॉकिंग रणनीति टेबल लॉक में बढ़ जाती है: लेनदेन अब पूरी तालिका को लॉक करता है और लेन-देन करने तक वापस आने या रोल करने तक कोई भी नहीं खेल सकता है।
चाहे आप कार्यात्मक रूप से नोलोक/पढ़ने के उपयोग से बचने से बच सकते हैं, अंतर्निहित डेटाबेस (और संगठन के संगठन की संस्कृति) को मारने वाली प्रक्रियाओं की प्रकृति पर पूरी तरह से निर्भर है।
स्वयं, मैं जितना संभव हो उतना उपयोग से बचने की कोशिश करता हूं।
उम्मीद है कि इससे मदद मिलती है।
एक सक्रिय स्नैपशॉट के साथ, डेडलॉक में चलने की आपकी संभावना क्या है? मैं सुझाव नहीं दूंगा कि आप मुझे एक प्रतिशत दे सकते हैं, लेकिन क्या आपने कभी इसे चलाने के साथ डेडलॉक में भाग लिया है? – Limey
ऐसा लगता है कि स्टैक ओवरफ्लो की समस्या ठीक हो गई है, मैंने स्वयं के साथ डेडलॉक्स नहीं देखा है, लेकिन मैं एसक्यूएल सर्वर प्रोग्रामिंग के मामले में कुछ सर्वोत्तम प्रथाओं को भी लागू करता हूं जो इसे – SQLMenace
से शुरू करने के लिए कम से कम एक अच्छा विचार नहीं है ... http: // sqlblogcasts .com/ब्लॉग/टोनीरोगर्सन/संग्रह/2006/11/16/1345.aspx – gbn