इस क्वेरी में गतिरोध क्यों होता है?


11

इस क्वेरी में गतिरोध क्यों होता है?

UPDATE TOP(1) system_Queue SET
  [StatusID] = 2,
  @ID = InternalID
WHERE InternalID IN (
    SELECT TOP 1 
      InternalID FROM system_Queue
    WHERE IsOutGoing = @IsOutGoing AND StatusID = 1
ORDER BY MessageID ASC, InternalID ASC)

डेडलॉक ग्राफ जोड़ा गया:

<keylock hobtid="72057594236436480" dbid="9" objectname="Z.dbo.system_Queue" indexname="PK_system_Queue" id="lock5b25cc80" mode="X" associatedObjectId="72057594236436480">
    <owner-list>
     <owner id="processc6fe40" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc7b8e8" mode="S" requestType="wait"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594405453824" dbid="9" objectname="Z.dbo.system_Queue" indexname="IX_system_Queue_DirectionByStatus" id="lock48cf3180" mode="S" associatedObjectId="72057594405453824">
    <owner-list>
     <owner id="processc7b8e8" mode="S"/>
    </owner-list>
    <waiter-list>
     <waiter id="processc6fe40" mode="X" requestType="wait"/>
    </waiter-list>
   </keylock>

जोड़े गए:

धन्यवाद शंकर लेख समाधान कैसे गतिरोध के इस प्रकार से बचने के लिए किया है कि के लिए:

  • पाठक के प्रक्षेपण से अनावश्यक स्तंभों को खत्म करना ताकि उसे गुच्छेदार सूचकांक को देखना न पड़े
  • अनुक्रमणिका को आच्छादित करने के लिए गैर-क्लस्टर किए गए अनुक्रमणिका में समाहित कॉलम के रूप में आवश्यक कॉलम जोड़ें, ताकि पाठक को क्लस्टर किए गए इंडेक्स पर नज़र न पड़े
  • उन अपडेट से बचें, जिन्हें नॉन-क्लस्टर्ड इंडेक्स मेंटेन करना है

आप किस db प्लेटफॉर्म के किस संस्करण का उपयोग कर रहे हैं? डिफ़ॉल्ट trx अलगाव (या संगामिति) स्तर क्या है? वर्तमान में system_Queue टेबल पर कौन से इंडेक्स मौजूद हैं?
SQLRockstar

@SQLRockstar गतिरोध ग्राफ का हिस्सा जोड़ा, sql सर्वर 2008
garik

@ SQLRockstar IX_system_Queue_DirectionByStatus IsOutGoing और StatusID द्वारा सूचकांक।
गरिक

जवाबों:


13

यह मुझे ऐसा लगता है जैसे आप एक ही स्टेटमेंट में और उसी टेबल पर एक SELECT और UPDATE करने की कोशिश कर रहे हैं।

SELECT IX_system_Queue_DirectionByStatus इंडेक्स के अंदर के मूल्यों पर एक साझा ताला लगा रहा है, और उन ताले को जारी करने के लिए UPDATE की आवश्यकता है इससे पहले कि यह अनन्य लॉक प्राप्त कर सके जो प्राथमिक कुंजी को अपडेट करेगा (जो मुझे लगता है कि क्लस्टर किया गया है और इसका भी हिस्सा है) IX_system_Queue_DirectionByStatus कुंजी मान)।

वैसे भी, मेरा अनुमान है कि यह क्वेरी केवल उस दुर्लभ मौके पर सफल होगी, जिसे सूचकांक मान चुन रहा है और अपडेट करना विरोधाभासी नहीं है। क्या हर बार आपके द्वारा निष्पादित किया गया गतिरोध है (मुझे लगता है कि यह होगा)।

यहाँ एक लिंक दिया गया है जो गतिरोधों को और अधिक विस्तार से बताता है: http://sqlblog.com/blogs/jonathan_kehayias/archive/2008/07/30/the-anatomy-of-a-deadlock.aspx


बिंगो! धन्यवाद। यह गतिरोध के लिए वास्तव में अजीब स्थिति थी जो मैंने कभी देखी है। उत्तर देने के लिए आपका शुक्रिया।
गरिक

6

मुझे उम्मीद नहीं है कि आप इस पोस्ट को एक उत्तर के रूप में चिह्नित करेंगे लेकिन इस विषय पर अन्य SQL सर्वर विशेषज्ञों द्वारा यहां अधिक जानकारी साझा कर रहे हैं।

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/01/01/reproducing-deadlocks-involving-only-one-table.aspx

http://rusanu.com/2009/05/16/readwrite-deadlock/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.