2010-01-20 8 views
10

क्या कोई मुझे SQL सर्वर 2005 में डेडलॉक के लिए मदद कर सकता है?गैर-सर्वर सूचकांक के साथ SQL Server 2005 डेडलॉक

एक साधारण परीक्षण के लिए, मेरे पास एक टेबल "बुक" है जिसमें प्राथमिक कुंजी (आईडी) और कॉलम नाम है। इस प्राथमिक कुंजी का डिफ़ॉल्ट अनुक्रमणिका nonclustered है।

डेडलॉक तब होता है जब दो सत्र एक ही समय में चलते हैं। गतिविधि मॉनिटर पहला सत्र "// चरण 1" दिखाता है जो एक्स लॉक के साथ पंक्ति (छुटकारा पाएं) को ताला लगा देता है। दूसरा सत्र पंक्ति यू लॉक और कुंजी यू लॉक रखता है। डेडलॉक चित्र से पहले सत्र के "// step2" में कुंजी यू लॉक की आवश्यकता होती है।

यदि सूचकांक क्लस्टर है, तो इस मामले में कोई डेडलॉक नहीं है। "// चरण 1" एक ही समय में पंक्ति और कुंजी लॉक रखेगा, इसलिए कोई समस्या नहीं है। मैं समझ सकता हूं कि एक पंक्ति को लॉक करने से इंडेक्स को भी लॉक कर दिया जाएगा क्योंकि क्लस्टर्ड इंडेक्स का पत्ता नोड पंक्ति डेटा है।

लेकिन, क्यों nonclustered अनुक्रमणिका इस तरह से है? यदि दूसरे सत्र में कुंजी यू लॉक है, तो पहले सत्र के "चरण 1" में इस लॉक को क्यों नहीं रखा जाता है क्योंकि वे अद्यतन कथन समान होते हैं।

--// first session 
BEGIN TRAN 
    update Book set name = name where id = 1 //step 1 
    WaitFor Delay '00:00:20' 
    update Book set name = 'trans' where id = 1 //step2 
COMMIT 

--// second session 
BEGIN TRAN 
--// this statement will keep both RID(U lock) and KEY(U lock) if first session did not use HOLDLOCK 
    update Book set name = name where id = 1 
COMMIT 
+0

क्या आपके पास अपनी नमूना बुक टेबल पर क्लस्टर्ड कुंजी है ?? मुझे नहीं लगता कि यह आपका प्रश्न है कि आपका पीके क्लस्टर किया गया है या नहीं - मुझे लगता है कि यह वास्तव में क्लस्टर्ड कुंजी (और इस प्रकार क्लस्टर्ड टेबल) है या आप एक ढेर से निपट रहे हैं या नहीं (कोई क्लस्टर इंडेक्स नहीं है)) –

+0

क्या आप डेडलॉक में होने पर 'exec sp_lock' का प्रासंगिक आउटपुट जोड़ सकते हैं? – Andomar

+0

sqlprofiler से, डेडलॉक चित्र दिखाता है कि पहले सत्र के "// step2" में कुंजी यू लॉक की आवश्यकता होती है, लेकिन यह seeion2 द्वारा आयोजित की जाती है। –

उत्तर

10

यहां प्रासंगिक कारक यह है कि आप अपने where खंड में एक कॉलम का उपयोग कर रहे हैं जिसमें एक नॉनक्लस्टर्ड इंडेक्स है। एसक्यूएल सर्वर एक अद्यतन संसाधित करता है, यह कुछ इस तरह चला जाता है: अद्यतन करने के लिए

  1. ढूँढें पंक्तियाँ, छुआ डेटा
  2. अद्यतन पंक्तियों पर यू ताले लेने, संशोधित आंकड़ों पर एक्स ताले लेने

के बाद कथन पूर्ण होता है (डिफ़ॉल्ट READ COMMITTED अलगाव के तहत), यू ताले जारी किए जाते हैं लेकिन एक्स ताले अलगाव बनाए रखने के लिए लेनदेन के अंत तक आयोजित होते हैं।

आपकी नॉनक्लस्टर्ड इंडेक्स स्थिति में, SQL सर्वर आईडी पर इंडेक्स पर चाहता है और वास्तविक पंक्ति को देखने के लिए इसका उपयोग करता है।लॉकिंग इस तरह खेलता है:

  1. (सत्र 1, चरण 1) यू = 1
  2. (सत्र 1, चरण 1) एक्स ताला आईडी के साथ पंक्ति के लिए RID पर लिया आईडी के लिए सूचकांक कुंजी मान पर ले लिया ताला = 1
  3. (सत्र 1, चरण 1) यू जारी किया गया ताला
  4. (सत्र 2) यू आईडी के लिए सूचकांक कुंजी मान पर ले लिया लॉक = 1
  5. (सत्र 2) एक्स ताला आईडी के साथ पंक्ति के लिए RID के लिए अवरुद्ध = 1
  6. (सत्र 1, चरण 2) यू लॉक आईडी = 1 के लिए सूचकांक कुंजी मान पर अवरुद्ध - डेडलॉक

हालांकि, जब सूचकांक संकुल अनुक्रमणिका है, वहाँ नहीं पंक्ति में सूचकांक कुंजी परिवर्तित करने के लिए एक अलग कदम है - संकुल अनुक्रमणिका मूल्य पंक्ति पहचानकर्ता है। इसलिए, लॉकिंग इस तरह समाप्त होता है:

  1. (सत्र 1, चरण 1) यू आईडी के लिए सूचकांक कुंजी मान पर ले लिया लॉक = 1
  2. (सत्र 1, चरण 1) यू एक्स ताला
  3. करने के लिए उन्नत ताला
  4. (सत्र 2) यू आईडी के लिए सूचकांक कुंजी मान पर अवरुद्ध कर ताला = 1
  5. (सत्र 1, चरण 2) पहले से ही आईडी के लिए सूचकांक कुंजी मान को आयोजित ताला = 1
  6. (सत्र 1, प्रतिबद्ध)
  7. जारी किया गया ताला
  8. (सत्र 2) यू लॉक
  9. (सत्र 2) यू एक्स ताला करने के लिए उन्नत ताला
  10. (सत्र 2)

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

+0

आपको बहुत बहुत धन्यवाद, यह मुझे समझ में आता है। यह समस्या गैर-क्लस्टर इंडेक्स में "सूचकांक कुंजी को पंक्ति में परिवर्तित करने के लिए अलग-अलग चरण" प्रतीत होती है। –

+0

यदि मैं दोनों सत्रों के लिए अद्यतन कथन में संकेत हॉललॉक जोड़ता हूं, तो यह हल हो जाता है क्योंकि यू और एक्स लॉक अभी भी सत्र 1 में आयोजित किए गए हैं। मेरी समझ है कि होल्डॉक केवल एस लॉक का अनुरोध करता है, मुझे आश्चर्य है कि क्यों होल्डॉक सत्र 1 को रख सकता है आरआईडी के लिए कुंजी और एक्स लॉक के लिए यू लॉक? धन्यवाद। –

+0

होल्डॉक अन्य संभावित समस्याओं का कारण बन सकता है (यानी एक और डेडलॉक, प्रदर्शन डाउनग्रेड)? –

0

यह लिंक उपयोगी सुझावों की एक बहुत है: SQL Server deadlocks between select/update or multiple selects

  1. क्या लेन-देन अलगाव स्तर आप उपयोग कर रहे:

    यहाँ कुछ बिंदुओं पर विचार करने के लिए है कि लोगों को अपने सवाल का जवाब देने में मदद कर सकते हैं कर रहे हैं?

  2. लॉक एस्केलेशन (जैसे पंक्ति से पृष्ठ तक) की अनुमति है?
  3. क्या 'नाम' कॉलम पर कोई अनुक्रमणिका है?

    update Book set name = name where id = 1 
    

    तेरा एक कमांड जो वास्तव में अपने स्तंभ है, तो एक विशेष ताला पंक्ति को आयोजित किया जाएगा परिवर्तन:

+0

1. पढ़ा गया 2. SQLServer द्वारा डिफ़ॉल्ट सेटिंग का उपयोग करें 3. कोई अन्य अनुक्रमणिका नहीं। –

0

आपका पहला अद्यतन वास्तव में कुछ भी संशोधित नहीं करता है।

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