डिलीट स्टेटमेंट पर गतिरोध


11

SQL सर्वर जॉब चलने पर मुझे एक डेडलॉक मिलता है। गतिरोध एक सरल DELETE कथन पर होता है। मैंने सोचा होगा कि गतिरोध पैदा करने के लिए एक SELECT / UPDATE क्वेरी चल रही होगी? लेकिन ऐसा लगता है कि यह DELETE / DELETE गतिरोध है ...

मैं जो देख रहा हूं, वह यह है कि मुझे DELETE / DELETE गतिरोध क्यों मिल रहा है। यह (मेरे ज्ञान के लिए) विभिन्न मापदंडों में गुजर रहा है।

कोई विचार? धन्यवाद।

deadlock-list
2014-05-20 07:30:09.66 spid25s      deadlock victim=process409048
2014-05-20 07:30:09.66 spid25s       process-list
2014-05-20 07:30:09.66 spid25s        process id=process409048 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127294 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x397219620 lockMode=U schedulerid=5 kpid=3792 status=suspended spid=150 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629860973 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2
2014-05-20 07:30:09.66 spid25s     DELETE FROM dbo.UserDetailsData WHERE        (Username = @P1) AND (UserDate = @P2)     
2014-05-20 07:30:09.66 spid25s          frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
2014-05-20 07:30:09.66 spid25s     unknown     
2014-05-20 07:30:09.66 spid25s         inputbuf
2014-05-20 07:30:09.66 spid25s        process id=process432e08 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127916 waittime=2648 ownerId=629859744 transactionname=DELETE lasttranstarted=2014-05-20T07:30:04.833 XDES=0x4c3426b50 lockMode=U schedulerid=6 kpid=5988 status=suspended spid=146 sbid=0 ecid=3 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:04.833 lastbatchcompleted=2014-05-20T07:30:04.820 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629859744 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2
2014-05-20 07:30:09.66 spid25s     DELETE FROM dbo.UserDetailsData WHERE        (Username = @P1) AND (UserDate = @P2)     
2014-05-20 07:30:09.66 spid25s          frame procname=unknown line=1 sqlhandle=0x000000000000000000000000000000000000000000000000
2014-05-20 07:30:09.66 spid25s     unknown     
2014-05-20 07:30:09.66 spid25s         inputbuf
2014-05-20 07:30:09.66 spid25s        process id=process39ea562c8 taskpriority=0 logused=0 waitresource=PAGE: 12:1:7127916 waittime=4352 ownerId=629860973 transactionname=DELETE lasttranstarted=2014-05-20T07:30:05.307 XDES=0x13e0e4b50 lockMode=U schedulerid=2 kpid=7124 status=suspended spid=150 sbid=0 ecid=1 priority=0 trancount=0 lastbatchstarted=2014-05-20T07:30:05.307 lastbatchcompleted=2014-05-20T07:30:05.307 clientapp=QSQL25 hostname=MORRIS hostpid=1528 isolationlevel=read committed (2) xactid=629860973 currentdb=12 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
2014-05-20 07:30:09.66 spid25s         executionStack
2014-05-20 07:30:09.66 spid25s          frame procname=adhoc line=1 stmtstart=68 sqlhandle=0x020000000b887a18f75d0aa07c25a9b8630fca696aa0e5d2

5
नहीं, SELECT / UPDATE के बाहर अन्य परिदृश्यों में गतिरोध उत्पन्न हो सकता है। आपको वास्तव में दो प्रक्रियाओं की आवश्यकता होती है, जिनमें से प्रत्येक को एक संसाधन की आवश्यकता होती है जो दूसरे को पकड़े हुए है। (1) क्या DELETE स्टेटमेंट एक बड़े लेनदेन का हिस्सा हैं? (२) क्या आप भ्रामक त्रुटि लॉग पाठ के बजाय कहीं डेडलॉक XML पोस्ट कर सकते हैं?
हारून बर्ट्रेंड

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

मैं XML कैसे प्राप्त करूं? SQL सर्वर त्रुटि लॉग से त्रुटि मिला। बयानों को विभिन्न मापदंडों के साथ कहा जाता है। हमने हाल ही में कई फ़िल्टर किए गए अनुक्रमित जोड़े हैं जो UserDate फ़ील्ड पर फ़िल्टर करते हैं।
K09

Profiler में गतिरोध ग्राफ घटना को पकड़ो। फिर, जब आप इसे पकड़ लेते हैं, तो पंक्ति पर राइट क्लिक करें -> इवेंट डेटा निकालें -> इसे कहीं .xdl के रूप में सहेजें और इसकी सामग्री को पास्टिबिन (या कहीं इसी तरह) पर पोस्ट करें (यह एक xml है)।
मैरियन

1
नमस्ते, XML यहाँ पोस्ट ... आशा है कि यह मदद करता है! dl.dropboxusercontent.com/u/16953128/DeadlockTest.xdl
K09

जवाबों:


14

मैं जो देख रहा हूं, वह यह है कि मुझे DELETE / DELETE गतिरोध क्यों मिल रहा है।

ऐसा प्रतीत होता है कि गतिरोध इसलिए होता है क्योंकि:

  1. spid 54 ecid 0एक अद्यतन प्राप्त करता है ( U) पेज लॉकPAGE: 12:1:5147422
  2. spid 166 ecid 3एक Uही पृष्ठ पर एक अद्यतन ( ) पेज लॉक का अनुरोध करता है , और ब्लॉक किया जाता है
  3. spid 54 ecid 2एक Uही पृष्ठ पर एक अद्यतन ( ) पेज लॉक का अनुरोध ...

क्वेरी द्वारा अपडेट किए गए लॉक के साथ पृष्ठ क्वेरी के लिए प्रीफ़ेट किए जा रहे हैं ecid 0। वह चरण 1 से ऊपर है। चरण 3 में, समान समानांतर क्वेरी ( ecid 2) का एक बच्चा धागा एक ही लॉक का अनुरोध करता है। आम तौर पर यह एक समस्या नहीं होगी। SQL सर्वर जानता है ecid 0और ecid 2एक ही मूल प्रक्रिया के धागे हैं। दुर्भाग्य से, चरण 2 इस के रास्ते में हो जाता है, और एक गतिरोध परिणाम।

कहा कि, आपको वास्तव में इस बात की ज्यादा परवाह नहीं करनी चाहिए कि गतिरोध क्यों होता है, महत्वपूर्ण सवाल यह है कि आप इससे कैसे बचते हैं। जवाब के लिए एक कुशल पहुँच पथ प्रदान करना है DELETE। बयान को पंक्तियों को खोजने की आवश्यकता है WHERE Username = @P1 AND UserDate = @P2, इसलिए आपके पास इन स्तंभों पर अनुक्रमित कुंजी होनी चाहिए।

और निश्चित रूप से आपके पास ऐसा सूचकांक है। असली सवाल क्यों अपनी समस्याओं के बाद आप फ़िल्टर अनुक्रमित जोड़ा होने वाली शुरू कर दिया है।

इसका उत्तर अतिरिक्त स्तंभ जानकारी को हटाने के लिए फ़िल्टर्ड अनुक्रमणिका पंक्तियों का पता लगाने के लिए (और उनके विधेय की जाँच करने के लिए) की आवश्यकता है। यदि क्वेरी संकीर्ण / प्रति-पंक्ति निष्पादन योजना का उपयोग करती है , तो निष्पादन इंजन क्लस्टर्ड इंडेक्स डिलीट ऑपरेटर में अतिरिक्त कॉलम लाने में असमर्थ है, क्योंकि यह एक विस्तृत / प्रति-इंडेक्स प्लान में होगा।

आप इस बारे में और अधिक विवरण, और इस ब्लॉग पोस्ट में काम करने वाले उदाहरण पा सकते हैं ।

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

इसका उत्तर निम्नलिखित में से एक करना है:

  1. फ़िल्टर किए गए इंडेक्स निकालें
  2. फ़िल्टर किए गए अनुक्रमणिका कुंजी जोड़ें / शामिल करें / मौजूदा नाम / दिनांक अनुक्रमणिका में स्तंभों को समर्पित करें
  3. एक विस्तृत अद्यतन योजना तैयार करें ( ऐसा करने का कोई समर्थित तरीका नहीं )
  4. स्नैपशॉट अलगाव के तहत क्वेरी चलाएँ (RCSI नहीं)

विकल्प 2 मेरी मजबूत प्राथमिकता होगी।

विकल्प 4 (धन्यवाद जैक डगलस) ने गतिरोधों को दूर करने का लाभ उठाया है, और किसी भी "अपडेट टकराव" का कारण नहीं होना चाहिए , परिवर्तनों की असंतुष्ट प्रकृति को देखते हुए, लेकिन इसके लिए डेटाबेस स्तर पर स्नैपशॉट अलगाव को सक्षम करने की आवश्यकता है, स्पष्ट रूप से अलगाव स्तर बदल रहा है, और अंतर्निहित समस्या को ठीक नहीं करेगा : आप अभी भी एक बेकार समानांतर तालिका स्कैन के साथ समाप्त होंगे, जहां एक अच्छा सूचकांक की तलाश है जो आप वास्तव में चाहते हैं।

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