2009-03-19 11 views
32

SQL सर्वर deadlocks पर सभी दस्तावेज़ परिदृश्य के बारे में बात करते हैं जिसमें ऑपरेशन 1 लॉक संसाधन ए फिर संसाधन बी और ऑपरेशन 2 लॉक संसाधन बी तक पहुंचने का प्रयास करता है और संसाधन ए तक पहुंचने का प्रयास करता हैचुनिंदा/अपडेट या एकाधिक चयन के बीच SQL सर्वर deadlocks

हालांकि, मैं अक्सर हमारे कुछ व्यस्त अनुप्रयोगों में चयन और अद्यतन के बीच या कई चयनों के बीच डेडलॉक्स देखता हूं। मुझे डेडलॉक ट्रेस आउटपुट के कुछ अच्छे बिंदु बहुत सुंदर हैं लेकिन मैं वास्तव में समझना चाहता हूं कि दो एकल संचालन के बीच डेडलॉक का कारण क्या हो सकता है। निश्चित रूप से यदि किसी चयन में रीड लॉक होता है तो अपडेट को केवल एक विशेष लॉक प्राप्त करने से पहले प्रतीक्षा करना चाहिए और इसके विपरीत?

यह SQL सर्वर 2005 पर हो रहा है कि मुझे नहीं लगता कि इससे कोई फर्क पड़ता है।

उत्तर

11

मैं एक बार एक अच्छा लेख SQL-Server-Performance.com पर के बारे में Advanced SQL Server locking बुकमार्क किए गए। यह आलेख शास्त्रीय डेडलॉक स्थिति से परे चला गया है जिसका आपने उल्लेख किया है और आपको अपनी समस्या में कुछ अंतर्दृष्टि दे सकता है।

0

आप लेन-देन अलगाव को पढ़ने चाहिए: http://msdn.microsoft.com/en-us/library/ms173763.aspx

+0

मैं अलगाव स्तर के बारे में समझता हूं, उपर्युक्त डेडलॉक्स को चुनिंदा पढ़ने के द्वारा हल किया जा सकता है लेकिन पढ़ने के लिए उस अद्यतन के साथ एक डेडलॉक में अद्यतन समाप्त होने से पहले क्यों पढ़ना चाहिए? –

1

लेनदेन और अलगाव स्तर पर ठीक से पढ़ें: कुछ घने लेकिन काफी गहन और प्रौद्योगिकी तटस्थ काम के लिए, Principles of Transaction Processing देखें। यह मेरी दुनिया को हिलाकर रख दिया (और मुझे कुछ सिरदर्द दिया!)।

मुझे यकीन नहीं है कि आपको क्या परेशानी हो रही है, या आप किस अलगाव स्तर का उपयोग कर रहे हैं। लेकिन इस पर विचार करें: सभी डेटाबेस इंजन के लिए, यदि आप एक लेनदेन में पढ़ते हैं, तो यह कैसे बता सकता है कि आप बाद में लिखने जा रहे हैं या नहीं? जब भी पढ़ा जाता है, तो उच्च अलगाव स्तरों को लॉकिंग की आवश्यकता होती है, संभावित रूप से पूरे टेबल पर प्रेत पढ़ने के खिलाफ सुरक्षा के लिए, क्योंकि डेटा बाद में लिखने को प्रभावित कर सकता है।

क्या आप चाहते हैं कि डेटाबेस आपके डेटा पर एक विशेष लॉक के लिए मनमाने ढंग से लंबे समय तक प्रतीक्षा करे? अपने अलगाव स्तर पर एक नज़र डालें, और क्या आप अनावश्यक रूप से एक अलग लेनदेन के रूप में पढ़ने की श्रृंखला चला रहे हैं। यह निर्धारित करने के लिए कैसे गंदी, पढ़ने आप बर्दाश्त कर सकते हैं, हालांकि हमेशा आसान नहीं है ... के रूप में वे एक पंक्तियाँ, नहीं पूरे तालिका ताला एकल प्रश्नों के बीच

+2

मुझे लगता है कि पोस्टर्स प्रश्न अलगाव स्तर पर सामान्य रेंट से अधिक विशिष्ट था इलाज कर सकते हैं। – eckes

+0

मैं वास्तव में पीओटीपी को एक रान के रूप में नहीं दिखाऊंगा। रोब ने विशेष रूप से लेनदेन को समझने में मदद के लिए कहा, और इसमें शामिल व्यापारिक समझौतों को समझने में कुछ परेशानी हुई। यदि उपयोगी साहित्य को इंगित करना जरूरी है, तो मैं शायद हर समय मुंह पर फूम कर रहा हूं! YMMV। –

5

ताले हो सकता है:

अद्यतन क्वेरी एक अद्यतन हो जाता है पर ताला तालिका में कुछ पंक्तियां, और चयन क्वेरी तालिका में कुछ अन्य पंक्तियों पर एक पठन लॉक हो जाती है। अद्यतन क्वेरी तब लॉक की गई पंक्तियों पर एक अद्यतन लॉक प्राप्त करने का प्रयास करती है, और चयन क्वेरी पंक्तियों पर रीड लॉक प्राप्त करने का प्रयास करती है जो अद्यतन लॉक हैं।

यह एस्केल्डिंग ताले के साथ और भी जटिल हो सकता है, यानी डेटाबेस निर्णय लेता है कि लेनदेन द्वारा लॉक की गई कई एकल पंक्तियां हैं ताकि इसे तालिका या पूरी तालिका के एक खंड को लॉक करने में आगे बढ़ना चाहिए। इसका मतलब यह है कि लॉक उन पंक्तियों को प्रभावित कर सकता है जो सीधे क्वेरी में शामिल नहीं हैं।

19

ऐसा इसलिए हो सकता है क्योंकि एक चयन दो अलग-अलग इंडेक्स पर लॉक लेता है, इस बीच एक अद्यतन विपरीत क्रम में एक ही इंडेक्स पर लॉक आउट लेता है। चयन को दो इंडेक्स की आवश्यकता होती है क्योंकि पहली अनुक्रमणिका में उन सभी कॉलम को शामिल नहीं किया जाता है जिन्हें इसे एक्सेस करने की आवश्यकता होती है; अपडेट को दो इंडेक्स की आवश्यकता होती है क्योंकि यदि आप किसी इंडेक्स के कुंजी कॉलम को अपडेट करते हैं तो आपको उस पर लॉक लेने की आवश्यकता होती है।

http://blogs.msdn.com/bartd/archive/2006/09/25/770928.aspx में एक शानदार स्पष्टीकरण है। सुझाए गए फिक्सेस में एक इंडेक्स जोड़ने शामिल है जिसमें सभी कॉलम को चुनिंदा ज़रूरतों को शामिल किया गया है, स्नैपशॉट अलगाव पर स्विच किया जा रहा है, या स्पष्ट रूप से अद्यतन लॉक को पकड़ने के लिए चयन को मजबूर कर रहा है जिसे सामान्य रूप से इसकी आवश्यकता नहीं होगी।

12

मुझे आश्चर्य है कि किसी ने भी WITH (UPDLOCK) लॉकिंग संकेत का उल्लेख नहीं किया है। यदि आपके पास डेडलॉक्स शामिल हैं तो यह बहुत उपयोगी है उदा। समानांतर में चल रहे दो चयन-सम्मिलित जोड़े।

एसक्यूएल सर्वर में, यदि आप WITH (UPDLOCK) साथ चयन जारी, दूसरे का चयन करें जब तक पहले चयन समाप्त हो गया है इंतजार करेंगे। अन्यथा वे साझा ताले प्राप्त करते हैं, और जब वे एक साथ विशेष ताले में अपग्रेड करने का प्रयास करते हैं, तो वे डेडलॉक करते हैं।

+0

'रॉल्फ क्रिस्टेनसेन' ने अपने उत्तर में पूरी तरह से 'अपडॉक)' समझाया। – Mahmoodvcs

4

मेरा अनुमान है कि चुनिंदा बयान एक पढ़ा-लॉक aquires, जब आप अद्यतन बयान के साथ आते हैं, तो यह एक राइट-लॉक करने के लिए उन्नत करने के लिए की जरूरत है। हम राइट-लॉक करने के लिए

उन्नयन की आवश्यकता है कि अन्य सभी पढ़ने के लिए ताले निकाल दिए जाते हैं (उनकी चुनिंदा-लेन-देन पूरा)। लेकिन अगर किसी अन्य प्रक्रिया में पहले से ही एक लेखन-लॉक में अपग्रेड करने का शानदार विचार है, तो अचानक आप दो प्रक्रियाओं को एक दूसरे के लिए रीड-लॉक जारी करने की प्रतीक्षा कर रहे हैं, ताकि वे लेखन-लॉक प्राप्त कर सकें।

यदि चयन के लिए अद्यतन (UPDLOCK) का उपयोग करना है तो यह शुरुआत से एक लेखन-लॉक प्राप्त करेगा और फिर आपके पास डेडलॉक समस्या नहीं होगी।

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