2010-02-11 7 views
25

मेरे पास दो लंबे चलने वाले प्रश्न हैं जो दोनों लेनदेन पर हैं और एक ही तालिका तक पहुंचते हैं लेकिन उन तालिकाओं में पूरी तरह अलग पंक्तियां हैं। ये प्रश्न उन प्रश्नों के आधार पर कुछ अद्यतन और आवेषण भी करते हैं।जब मैं एक पंक्ति को अद्यतन/सम्मिलित करता हूं तो क्या यह पूरी तालिका को लॉक कर लेता है?

ऐसा प्रतीत होता है कि जब ये एक साथ चलते हैं तो उन्हें किसी प्रकार का ताला सामना होता है और यह कार्य को खत्म करने से रोकता है और पंक्तियों में से किसी एक को अपडेट करने के लिए लॉक हो जाता है। मैं पंक्तियों पर एक विशेष पंक्ति लॉक का उपयोग कर रहा हूं और प्रक्रिया पर दिखाए गए लॉक एक lck_m_ix लॉक है।

दो सवाल:

  1. जब मैं अद्यतन/एक ही पंक्ति यह पूरे तालिका लॉक करता डालने?
  2. इस तरह के मुद्दे के आसपास काम करने के लिए क्या किया जा सकता है?

उत्तर

20

आमतौर पर कोई है, लेकिन यह (SQL सर्वर के लिए सबसे अक्सर इस्तेमाल जवाब!) निर्भर करता है

एसक्यूएल सर्वर किसी तरह से एक लेनदेन में शामिल डेटा लॉक करने के लिए होगा। जब आप एक संशोधन करते हैं, तो इसे डेटा में डेटा को लॉक करना होगा, और किसी भी प्रभावित इंडेक्स को डेटा लॉक करना होगा। समेकन सुधारने के लिए, कई प्रक्रियाओं को चलाने की अनुमति देने के लिए सर्वर लॉकिंग के कई "ग्रैन्युलरिटी" हैं, पंक्ति लॉक, पेज लॉक और टेबल लॉक आम हैं (और भी हैं)। लॉकिंग का कौन सा पैमाने खेल में है इस पर निर्भर करता है कि सर्वर किसी दिए गए अपडेट को निष्पादित करने का निर्णय कैसे लेता है। जटिल चीजें, साझा, अनन्य और इरादे विशेष जैसे ताले के वर्गीकरण भी हैं, जो नियंत्रित करते हैं कि लॉक ऑब्जेक्ट को पढ़ा जा सकता है और/या संशोधित किया जा सकता है या नहीं।

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

यह देखने के लिए कि आपके विशिष्ट मामले में क्या हो रहा है, आपको क्वेरी तर्क देखना होगा, और जब आपकी सामग्री चल रही है, sys.dm_tran_locks, sys.dm_os_waiting_tasks या अन्य DMV में लॉकिंग/अवरुद्ध स्थितियों की जांच करें। आप यह जानना चाहते हैं कि आपकी प्रत्येक प्रक्रिया में कौन सा कदम है, यह पता लगाने के लिए कि कोई दूसरे को अवरुद्ध क्यों कर रहा है, वास्तव में क्या लॉक हो रहा है।

1

विभिन्न डेटाबेस में अलग लॉकिंग तंत्र होते हैं, लेकिन SQL सर्वर और ओरेकल जैसे लोगों के पास विभिन्न प्रकार के लॉकिंग होते हैं।

SQL सर्वर पर डिफ़ॉल्ट निराशावादी पृष्ठ लॉकिंग प्रतीत होता है - इसलिए यदि आपके पास रिकॉर्ड की एक छोटी संख्या है तो वे सभी लॉक हो सकते हैं।

अधिकांश डेटाबेस किसी स्क्रिप्ट को चलाने के दौरान लॉक नहीं होना चाहिए, इसलिए मैं सोच रहा हूं कि आप संभावित रूप से लेन-देन के बिना कई प्रश्नों को एक साथ चल रहे हैं या नहीं।

+0

मैं हमेशा लॉक संकेतों का उपयोग करता हूं, इसलिए मैं स्पष्ट रूप से एक पगेलॉक – Middletone

18

लघु संस्करण:

  1. नहीं
  2. अपने कोड को ठीक करें।

लंबे संस्करण:

LCK_M_IX कोई लक्ष्य ताला, आपरेशन जिसका अर्थ है एक अधीनस्थ तत्व पर एक एक्स ताला जगह नहीं है। उदाहरण के लिए।किसी तालिका में पंक्ति को अपडेट करते समय, एक्स को पंक्ति को अद्यतन/डालने/हटाए जाने से पहले ऑपरेशन टेबल तालिका पर एक IX लॉक लेता है। इरादे ताले पदानुक्रमों से निपटने के लिए आम रणनीति हैं, जैसे टेबल/पेज/पंक्ति, क्योंकि लॉक मैनेजर लॉक होने के लिए अनुरोध किए गए संसाधनों की भौतिक संरचना को समझ नहीं सकता है (यानी यह नहीं पता कि पेज पी 1 पर एक्स-लॉक एक के साथ असंगत है पंक्ति आर 1 पर एस-लॉक क्योंकि आर 1 पी 1 में निहित है)। अधिक जानकारी के लिए, Lock Modes देखें।

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

अधिक सामान्य दृष्टिकोण SNAPSHOT ISOLATION पर भरोसा करना है। लेकिन, सबसे अधिक संभावना है कि आप जो समस्या देख रहे हैं उसे हल नहीं करेंगे, क्योंकि स्नैपशॉट अलगाव केवल पंक्ति स्तर के विवाद मुद्दों का लाभ उठा सकता है, न कि उन अनुप्रयोगों को जो टेबल लॉक का अनुरोध करते हैं।

9

लेनदेन का उपयोग करने का एक लगातार उद्देश्य: जितना संभव हो उतना छोटा और मीठा रखें। मुझे इस सवाल में आपके शब्द से समझ मिलती है कि आप एक लेनदेन खोल रहे हैं, फिर सभी प्रकार की चीजें कर रहे हैं, जिनमें से कुछ लंबे समय तक लेते हैं। फिर कई उपयोगकर्ताओं को एक ही कोड को एक साथ चलाने में सक्षम होने की उम्मीद है। दुर्भाग्यवश, यदि आप कोड के उस सेट की शुरुआत में एक सम्मिलित करते हैं, तो वापस आने या रोल करने से पहले 40 अन्य चीजें करें, यह संभव है कि वह सम्मिलन हर किसी को उसी प्रकार के डालने से रोक देगा, अनिवार्य रूप से आपके ऑपरेशन को बदलना धारावाहिक के लिए सभी के लिए मुफ्त।

पता लगाएं कि प्रत्येक क्वेरी क्या कर रही है, और यदि आपको लॉक एस्केलेशन मिल रहे हैं जिन्हें आप उम्मीद नहीं करेंगे। सिर्फ इसलिए कि आप किसी क्वेरी पर (ROWLOCK) के साथ कहते हैं इसका मतलब यह नहीं है कि SQL सर्वर अनुपालन करने में सक्षम होगा ... यदि आप एकाधिक अनुक्रमणिका, अनुक्रमित विचार, निरंतर गणना कॉलम इत्यादि को छुआ हैं तो आपके सभी प्रकार के कारण हैं कोई पानी नहीं हो सकता है। आपके पास लेन-देन में बाद में चीजें भी हो सकती हैं जो आपके विचार से अधिक समय ले रही हैं, और शायद आपको यह नहीं पता कि लेनदेन में शामिल सभी वस्तुओं पर ताले (न केवल वर्तमान में चल रहे बयान) के लिए आयोजित किया जा सकता है लेनदेन की अवधि।

+1

हाय हारून के साथ समाप्त नहीं होने के साथ (रोलॉक) का उपयोग कर रहा हूं, क्या आप विस्तारित कर सकते हैं जब "लगातार गणना किए गए कॉलम" अधिक लॉकिंग का कारण बनते हैं, जब वे निश्चित रूप से अनुक्रमित नहीं होते हैं । धन्यवाद। –

+1

क्षमा करें एलेक्स, मुझे दोबारा दोहराएं। मेरा मतलब था जब आप लगातार गणना किए गए कॉलम को छू रहे थे जो अनुक्रमित होने के साथ भी होते हैं। –

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

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