क्या समान प्रश्नों को बनाए रखते हुए गतिरोध को रोकने का कोई तरीका है?
गतिरोध ग्राफ से पता चलता है कि यह विशेष गतिरोध एक बुकमार्क लुकअप (इस मामले में एक RID लुकअप) से जुड़ा रूपांतरण गतिरोध था:
जैसा कि प्रश्न नोट करता है, सामान्य गतिरोध का जोखिम इसलिए उठता है क्योंकि प्रश्न विभिन्न क्रमों में समान संसाधनों पर असंगत ताले प्राप्त कर सकते हैं। SELECT
क्वेरी, RID देखने की वजह से मेज से पहले सूचकांक का उपयोग करने की जरूरत है, जबकि UPDATE
सूचकांक क्वेरी संशोधित तालिका पहले, तो।
गतिरोध को खत्म करने के लिए गतिरोध सामग्री में से एक को हटाने की आवश्यकता होती है। निम्नलिखित मुख्य विकल्प हैं:
- गैर-अनुक्रमित अनुक्रमणिका बनाकर RID लुकअप से बचें। यह संभवतः आपके मामले में व्यावहारिक नहीं है क्योंकि
SELECT
क्वेरी 26 कॉलम लौटाती है।
- क्लस्टर इंडेक्स बनाकर RID लुकअप से बचें। इसमें कॉलम पर एक क्लस्टर इंडेक्स बनाना शामिल होगा
Proposal
। यह विचार करने योग्य है, हालांकि यह प्रतीत होता है कि यह स्तंभ प्रकार का है uniqueidentifier
, जो व्यापक मुद्दों पर निर्भर करते हुए क्लस्टर इंडेक्स के लिए एक अच्छा विकल्प हो सकता है या नहीं।
READ_COMMITTED_SNAPSHOT
या SNAPSHOT
डेटाबेस विकल्पों को सक्षम करके पढ़ते समय साझा ताले लेने से बचें । इसके लिए सावधानीपूर्वक परीक्षण की आवश्यकता होगी, विशेष रूप से किसी भी डिज़ाइन-इन ब्लॉकिंग व्यवहार के संबंध में। ट्रिगर कोड को तर्क को सही ढंग से निष्पादित करने के लिए परीक्षण की भी आवश्यकता होगी।
- क्वेरी के
READ UNCOMMITTED
लिए आइसोलेशन स्तर का उपयोग करते हुए साझा किए गए ताले लेने से बचें SELECT
। सभी सामान्य कैविएट लागू होते हैं।
- एक विशेष एप्लिकेशन लॉक का उपयोग करके प्रश्न में दो प्रश्नों के समवर्ती निष्पादन से बचें (देखें sp_getapplock )।
- सुगमता से बचने के लिए टेबल लॉक संकेत का उपयोग करें। यह विकल्प 5 की तुलना में एक बड़ा हथौड़ा है, क्योंकि यह अन्य प्रश्नों को प्रभावित कर सकता है, न कि प्रश्न में पहचाने गए दो।
क्या मैं टेबल और इंडेक्स एक्सेस को एक ही क्रम में सुनिश्चित करने के लिए अपडेट से पहले अपडेट लेन-देन में सूचकांक पर एक्स-लॉक ले सकता हूं
आप एक स्पष्ट लेनदेन में अद्यतन को लपेटकर और अपडेट से पहले गैर-अनुक्रमित सूचकांक मूल्य पर SELECT
एक XLOCK
संकेत के साथ यह कोशिश कर सकते हैं । यह आप पर निर्भर करता है कि यह जानने के लिए कि गैर-अनुक्रमित सूचकांक में वर्तमान मूल्य क्या है, निष्पादन योजना सही हो रही है, और इस अतिरिक्त लॉक को लेने के सभी दुष्प्रभावों का सही अनुमान लगा रही है। यह लॉकिंग इंजन पर भी निर्भर करता है कि स्मार्ट होने के कारण लॉक होने से बचने के लिए पर्याप्त स्मार्ट नहीं है बेमानी होने फैसला ।
संक्षेप में, जबकि यह सिद्धांत रूप में संभव है, मैं इसकी अनुशंसा नहीं करता। रचनात्मक तरीके से किसी चीज़ को याद करना या अपने आप को बाहर करना बहुत आसान है। यदि आप वास्तव में इन गतिरोधों (केवल उनका पता लगाने और पुन: प्रयास करने के बजाय) से बचना चाहते हैं, तो मैं आपको ऊपर सूचीबद्ध अधिक सामान्य समाधानों के बजाय देखने के लिए प्रोत्साहित करूंगा।