2013-08-23 7 views
5

मैं एसक्यूएल सर्वर 2012डेडलॉक ग्राफ दिखा अज्ञात सूचकांक नाम

में एक गतिरोध की स्थिति प्राप्त एसक्यूएल सर्वर प्रोफाइलर चलाने के बाद, मैं नीचे के रूप में एक गतिरोध ग्राफ मिला प्रक्रियाओं (अंडाकार), दोनों प्रक्रियाओं ने समान तैयारी स्टेटमेंट क्वेरी (मैं जेडीबीसी का उपयोग कर रहा हूं) दिखाया।

क्वेरी मैं उपयोग कर रहा हूँ इस प्रकार है:

MERGE INTO MA4TB_MT_LOG_MSG USING (VALUES (1)) AS S(Num) ON (MSG_ID = ?) 
      WHEN MATCHED THEN 
       UPDATE SET 
        DIST_DATE = ?, 
        DIST_CODE = ? 
      WHEN NOT MATCHED THEN 
       INSERT (
        MSG_ID, DIST_DATE, DIST_CODE 
       ) VALUES (
        ?,?,? 
       ); 

बात यह है कि परेशान मुझे कुंजी ताला संसाधन बॉक्स के तहत सूचकांक नाम है।

मेरे पास MA4TB_MT_LOG_MSG तालिका के अंतर्गत '1' नामक एक अनुक्रमणिका नहीं है।

MSG_ID MA4TB_MT_LOG_MSG की प्राथमिक कुंजी है और DIST_DATE, DIST_CODE पर कोई अनुक्रमणिका नहीं है।

इस डेडलॉक स्थिति पर सलाह के किसी भी रूप की सराहना की जाएगी।

अग्रिम धन्यवाद,

उत्तर

4

अपने पहले प्रश्न का उत्तर देना बंद कर दें। मेरे पास इंडेक्स आईडी नहीं है = 1.

हाँ आप करते हैं !!

चलो एसक्यूएल सर्वर 2014 सीटीपी 2 पर एडवेंचर वर्क्स 2012 डेटाबेस पर एक नज़र डालें। यह मेरा लैपटॉप विनिर्देश है।

एक टेबल नाम [AWBuildVersion] है। इसमें आपकी तालिका की तरह क्लस्टर्ड इंडेक्स है। इंडेक्स के तहत, हम देख सकते हैं कि पीके दिख रहा है। अगर हमें तालिका (sys.objects) की ऑब्जेक्ट आईडी मिलती है और इंडेक्स (sys.indexes) के लिए प्रविष्टि को देखते हैं, तो हम देख सकते हैं कि इंडेक्स स्थिति पर है 1.

संक्षेप में, डिफ़ॉल्ट रूप से प्राथमिक कुंजी एक क्लस्टर सूचकांक है।

http://technet.microsoft.com/en-us/library/ms177443(v=sql.105).aspx

enter image description here

ठीक है, तो क्या एक सूचकांक के बिना एक मेज है? उन तालिकाओं को ढेर कहा जाता है। उनके पास शून्य की स्थिति में अपनी खुद की अनुक्रमणिका होती है जो पहले आईएएम पेज को इंगित करती है।

http://technet.microsoft.com/en-us/library/ms188270(v=sql.105).aspx

नीचे कोड एक स्कीमा का चयन करें जांच का उपयोग कर एक नया स्कीमा [चालाक] और प्रतियां [AWBuildVersion] तालिका कहा जाता है बनाता है। चयन के बारे में अच्छी बात यह है कि कोई इंडेक्स नहीं चलाया जाता है।

use AdventureWorks2012 
go 

create schema [crafty] authorization [dbo]; 
go 

select * into crafty.awbuildversion from dbo.awbuildversion 
go 

संक्षेप में, हम शून्य पर स्थिति सूचकांक के साथ परिभाषित ढेर देख सकते हैं।

enter image description here

तो एक गतिरोध क्या है और अनुरोध मोड यू क्या मतलब है?

एक डेडलॉक तब होता है जब दो प्रक्रियाएं एक ही समय में संसाधनों को पकड़ती हैं लेकिन उसी क्रम में नहीं। संक्षेप में, दोनों प्रक्रियाएं आगे नहीं बढ़ सकती हैं। इंजन कम से कम रोलबैक समय के साथ सत्र चुनता है और प्रक्रिया को मारता है।

http://technet.microsoft.com/en-us/library/ms178104(v=sql.105).aspx

एक तस्वीर एक हजार शब्दों के बराबर है! लेनदेन 1 grabs संसाधन 1. लेनदेन 2 grabs संसाधन 2. जब वे एक दूसरे को संसाधनों को पकड़ने की कोशिश करते हैं, एक डेडलॉक बनाया जाता है।

enter image description here

तो एक कुंजी लॉक और यूजर मोड यू क्या मतलब है?

अपनी तालिका अपडेट करने के लिए, आपको डेटा/अनुक्रमणिका पृष्ठों को अपडेट करने की आवश्यकता है। लेकिन डेटा पेज वास्तव में आपकी तालिका में इंडेक्स पेज (क्लस्टरेड इंडेक्स) हैं। एसक्यूएल इंजन एक (यू) पीडीएटी लॉक लेता है। वास्तविक लॉक के दौरान यह लॉक एक विशेष लॉक (एक्स) में बढ़ जाएगा।

जब दो प्रक्रियाएं एक विशेष लॉक का अनुरोध करती हैं, तो डेडलॉक की संभावना होती है।

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

डिफ़ॉल्ट अलगाव स्तर असामान्य पढ़ें।

http://technet.microsoft.com/en-us/library/ms175519(v=sql.105).aspx

इस बिंदु पर, आप एक गतिरोध की है।

आप यहां से कहां जाते हैं?

1 - संभवतः एक से अधिक सत्र (एसपीआईडी) एक ही कोड चला रहे हैं। क्यूं कर? क्या आप इसे बदल सकते हैं ताकि एक ही समय में केवल एक प्रक्रिया कोड चला सके?

2 - जेडीबीसी द्वारा उत्पन्न वास्तविक टीएसक्यूएल को पकड़ो। यह एसक्यूएल प्रोफाइलर और/या आपके डीएमवी के माध्यम से देखे जा सकते हैं।

विलय विवरण दोनों अद्यतन और/या INSERT करता है। इस प्रकार एक यौगिक ऑपरेशन।

3 - क्या आप अलगाव स्तर को क्रमबद्ध करने के लिए बदल सकते हैं?
http://technet.microsoft.com/en-us/library/ms173763.aspx

इससे अधिक ताले जोड़े जाएंगे और शायद आपके डेडलॉक मुद्दे को टाइमआउट समस्या में बदल देंगे। LOCK_TIMEOUT को कैसे सेट किया जा सकता है इस पर Kalen Daleny आलेख देखें। बीच में कुछ देरी के साथ ऑपरेशन को फिर से प्रयास करने के लिए आपको अपना कोड समायोजित करना होगा।

http://sqlmag.com/sql-server/inside-sql-server-controlling-locking

मुझे आशा है कि इस जानकारी में मदद करता है।

यदि आपको और सहायता चाहिए तो कृपया अपना टीएसक्यूएल पोस्ट करें।

0

लॉक ग्राफ को दिखाने के लिए पूरी तालिका बंद कर दिया जा रहा है लगता है।

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

आपके लिए देखने के लिए बहुत सारी चीज़ें!

0

मुझे लगता है कि "सूचकांक नाम: 1" संकुल अनुक्रमणिका

1

एसक्यूएल प्रोफाइलर से कि चार्ट/माउसओवर में प्रदर्शित किया जाता है और अधिक जानकारी उत्पन्न की वस्तु आईडी पर बात कर रहा है, और है कि जानकारी या अधिक प्रकाश डाला नहीं हो सकता है आपकी समस्या पर इस प्रयास करें:

  • प्रोफाइलर में पंक्तियों का कारण बनता है कि ग्राफ
  • एक "कॉपी" क्या प्रदर्शित करने के लिए चयन करें (Ctrl + C, या मेनू विकल्प)
  • एक पाठ संपादक में चिपकाएं (जैसे एक SSMS क्वेरी विंडो)
  • तुम क्या चाहते प्रोफाइलर "पाठ" स्तंभ के एक्सएमएल सामग्री रहे हैं - सब कुछ को नष्ट
  • खुला एक XML संपादक में इस एक्सएमएल (जो भी आप देखेंगे कि यह सुपाठ्य बनाता है, मैं माइक्रोसॉफ्ट के XML का उपयोग नोटपैड)
  • नीचे ड्रिल करें। यह थोड़ा सा लगता है, लेकिन एक बार जब आप लेआउट (पदानुक्रम, टैग नाम इत्यादि) का लटका प्राप्त करते हैं तो चीजें स्पष्ट होनी चाहिए
संबंधित मुद्दे