2010-01-13 8 views
5

आइए कहें कि मैं एक लेनदेन खोलता हूं और अपडेट क्वेरी चलाता हूं।क्या मैं एक लेनदेन के भीतर एक प्रश्न निष्पादित नहीं कर रहा हूं, तो क्या मैं डेडलॉक पीड़ित हो सकता हूं?

BEGIN TRANSACTION 
UPDATE x SET y = z WHERE w = v 

क्वेरी सफलतापूर्वक वापस आती है और लेन-देन समय की अवधि के लिए जानबूझ कर खुला रहता है इससे पहले कि मैं प्रतिबद्ध करने के लिए निर्णय लेते हैं।

जबकि मैं लेनदेन पर बैठा हूं, यह संभव है कि एमएसएसक्यूएल डेडलॉक मशीनरी मेरे खुले लेनदेन को मुक्त करने में सक्षम हो, जो वास्तव में किसी डेडलॉक या मुक्त संसाधनों को साफ़ करने के लिए कुछ भी निष्पादित नहीं कर रही है क्योंकि सिस्टम मेमोरी/संसाधन सीमाएं पहुंच चुकी हैं ?

मुझे एसईटी डेडलॉक_PRIORITY के बारे में पता है और डेडलॉक्स के विषय पर एमएसडीएन लेख पढ़ चुके हैं। तर्कसंगत रूप से क्योंकि मैं सक्रिय रूप से किसी भी अतिरिक्त संसाधन पर दावा करने की मांग नहीं कर रहा हूं, मैं एक परिदृश्य की कल्पना नहीं कर सकता जो एक सैने डेडलॉक टावरेंस एल्गोरिदम को ट्रिगर करेगा।

क्या किसी को यह सुनिश्चित करने के लिए पता है कि क्या यह संभव है कि किसी भी ताले को पकड़ने से मुझे वैध लक्ष्य मिल सके? इसी प्रकार कोई भी कम संसाधन स्थिति मेरे एसपीआईडी ​​की हत्या को ट्रिगर कर सकती है?

+0

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

उत्तर

3

नहीं

एक गतिरोध गतिरोध श्रृंखला में सभी प्रतिभागियों होने के लिए एक संसाधन (एक ताला) के लिए इंतजार कर होना चाहिए। यदि आपका कनेक्शन निष्क्रिय है तो इसका मतलब है कि यह एक अनुरोध निष्पादित नहीं करता है, जिसका अर्थ है कि यह प्रतीक्षा नहीं कर सकता है।

अन्य शर्तों कि आपके सत्र मैं कम से कम तीन के बारे में सोच सकते हैं मार सकता है के लिए के रूप में: शायद द्वारा एक मजाक के रूप में,

  • प्रशासनिक कार्य है कि ROLLBACK_IMMEDIATE
  • एक मिरर विफलता
  • जानबूझकर KILL <yourspid> के साथ प्रयोग आपका दोस्ताना डीबीए
+0

उन दोस्ताना डीबीए से प्यार होना चाहिए ... – Rory

+0

क्या आप वाकई _waiting_ होना चाहते हैं? क्या होगा यदि वह एक और थ्रेड को अवरुद्ध कर रहा है, और WAITFOR पर बैठा है? –

+0

@ जॉन: हाँ, यह * संसाधन के लिए इंतजार कर रहा है। यदि टी 1 WAITFOR में टी 2 और टी 2 के स्वामित्व वाले संसाधन ए के लिए इंतजार कर रहा है तो टी 2 फिर से शुरू होने पर * प्रगति होगी *। टी 2 को बंद करने के लिए डेडलॉक श्रृंखला के लिए संसाधन का इंतजार करना पड़ता है, अन्यथा डेडलॉक पहचान पूरी सर्कल नहीं देखेगी और हस्तक्षेप नहीं करेगी। इसके अलावा पूर्ण सर्कल एसक्यूएल के अंदर होना चाहिए, यदि टी 2 टी 1 के स्वामित्व वाले एप्लिकेशन सेमफोर पर इंतजार कर रहा है तो सर्कल एसक्यूएल के बाहर पूरा हो जाता है और फिर पता नहीं लगाया जाएगा। –

-1

सिर्फ इसलिए कि आप लेनदेन में नहीं हैं इसका मतलब यह नहीं है कि आप ताले नहीं रख रहे हैं।

+1

मैं देख सकता हूं कि आपने इसे क्यों पोस्ट किया है, शीर्षक खराब शब्द है। हालांकि, उनका मतलब है कि लेनदेन में, वह वास्तव में एक प्रश्न नहीं चला रहा है। (वह एक लेनदेन में है, लेकिन एसक्यूएल सामान नहीं कर रहा है।) कम से कम मैं इसे कैसे पढ़ता हूं। – Vaccano

+0

जैसा कि मैंने कहा था, क्या मायने रखता है कि वह लेनदेन में है या नहीं - उसके पास कौन से ताले हैं, और ताले के लिए वह इंतजार कर रहा है। डेडलॉक पहचान एल्गोरिदम के ब्योरे के आधार पर, ऐसा लगता है कि अगर वह लॉक रखता है और बहुत लंबे समय तक "कुछ भी नहीं कर रहा है" तो उसे डेडलॉक का हिस्सा माना जा सकता है। –

+0

पहचान एल्गोरिदम के मामले में मैंने कुछ भी खोजने की कोशिश की जो लॉक होल्ड टाइम का पता लगाने का पता लगाने एल्गोरिदम निर्णय प्रक्रिया का हिस्सा है। क्या इसका कोई पहला हाथ अनुभव या संदर्भ है जिसका मैं अनुसरण कर सकता हूं? मेरी अधिकांश जानकारी इस बात से आती है: http://msdn.microsoft.com/en-us/library/ms178104.aspx यह बताता है कि डेडलॉक पहचान प्रक्रिया 5 सेकंड अंतराल पर चलती है लेकिन यह सब मुझे ढूंढने में सक्षम था। – Einstein

0

लेनदेन समय समाप्त हो सकता है, यह हो रहा है कि क्या हो रहा है।

आप कम से कम 1 (या अधिक) अद्यतन ताले बाहर ले जाया गया और कुछ ताले पढ़ने और मेज स्कैन हो कर गए हैं, आप अन्य लेनदेन द्वारा बनाई गतिरोध बनाने में सहायता करने मारा जा सकता है। एसक्यूएल सर्वर में डेडलॉक रिकवरी कोड पूरी तरह से बग फ्री होने की संभावना नहीं है और यह SQL सर्वर पर लंबे समय तक के लिए लेनदेन को खोलने के लिए सामान्य नहीं है। हालांकि मैं अक्सर ऐसा होने की उम्मीद नहीं करता।


कुछ सिस्टम जब वे गतिरोध प्रकार समस्या को अलग, बस की हत्या "लंबे समय से रहते थे" लेनदेन है कि मैच का काम इतनी के रूप में ऊपर ताले मुक्त करने के लिए नहीं किया है, शुरू करते हैं। सिर्फ इसलिए कि आप डेडलॉक पाश का हिस्सा नहीं हैं, इसलिए सिस्टम आपको चुनने से नहीं रोकता है।

को समझने के लिए क्या अपने मामले में चल रहा है, तो आप Sql सर्वर प्रोफाइलर उपयोग करने के लिए सभी लॉकिंग से संबंधित घटनाओं, साथ ही निरस्त किया गया कनेक्शन और लेन-देन आदि अच्छा कमी के बारे में घटना को इकट्ठा करने और गतिरोध करना होगा यह कुछ समय और प्रोफाइलर घटनाओं की समझ का एक अच्छा स्तर होगा जो आप देख रहे हैं ...

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

+0

यह वह चीज है जिसकी मैं तलाश कर रहा हूं .. क्या मैं पूछ सकता हूं कि आप क्या कहने के लिए नेतृत्व करते हैं, जो किसी को हल करने के लिए किसी डेडलॉक में सीधे शामिल नहीं हो सकते हैं? क्या कोई संदर्भ या विशिष्ट अनुभव है? – Einstein

0

संभावित समस्याओं: केवल

  1. एसक्यूएल सर्वर ताले की एक सीमित संख्या है। ताले से बाहर निकलना संभव है।

  2. अन्य संसाधन सीमित हैं (उदा। स्मृति, tempdb)। इन संसाधनों पर होल्डिंग से उन संसाधनों को समाप्त हो सकता है।

  3. लेनदेन लॉग - लेनदेन खुला होने पर तार्किक लेनदेन लॉग को पुन: उपयोग के लिए मुक्त नहीं किया जा सकता है। नतीजा एक लॉग हो सकता है जो भर जाता है। यह समस्या आपकी प्रक्रिया को रोक सकती है क्योंकि यह पूरे उदाहरण को रोक देगा।

पर विचार करने के लिए:

  1. CASCADE: DELETE केवल आदेश में एक मेज है, लेकिन एक झरना संबंध अन्य तालिकाओं छू सकता है।

  2. ट्रिगर: संशोधित तालिका पर ट्रिगर्स अन्य तालिकाओं को प्रभावित कर सकते हैं।

  3. हटाएं और अद्यतन आदेश FROM खंड का उपयोग कर सकते हैं जो अन्य तालिकाओं को स्पर्श करता है। मैंने इसे कभी नहीं देखा है, लेकिन मैं इसे रद्द नहीं करूँगा।

3

आपके प्रश्न का उत्तर करने के लिए: आप एक गतिरोध शिकार हो सकते हैं यदि आप एक सौदे में एक प्रश्न को क्रियान्वित नहीं कर रहे हैं।

यह प्रतिद्वंद्वी है, लेकिन आप SELECT कथन चलाकर एक डेडलॉक पीड़ित हो सकते हैं।

आप एक प्रश्न एक सूचकांक का उपयोग करता है चला रहे हैं यह हो सकता है:

  • अन्य प्रक्रिया को अद्यतन करने के डेटा पृष्ठों शुरू होता है

    • आप अनुक्रमित मिलान पंक्तियों की तलाश में स्कैन

    • अब आप मिलान पृष्ठों से डेटा पृष्ठों से डेटा प्राप्त करना चाहते हैं

      डेटा पृष्ठों पर दूसरे को पकड़े प्रक्रिया ताले

      आप डेटा पेज ताले के लिए प्रतीक्षा

    • अन्य प्रक्रिया डेटा पृष्ठों को अपडेट कर लेने रिलीज करने के लिए, अनुक्रमित

      अद्यतन करने के लिए चाहता है आप इंडेक्स पर रीड लॉक धारण कर रहे हैं

      अन्य प्रक्रिया इंतजार कर रहा है सूचकांक ताले को रिहा करने के लिए

    • गतिरोध

    तो, कडाई के साथ आप हो सकता है एक गतिरोध शिकार, आप जब क्रियान्वित नहीं कर रहे हैं एक लेनदेन में एक प्रश्न। दूसरा लड़का लेनदेन में अपने UPDATE कथन को निष्पादित नहीं कर रहा था।

    कोई भी लेनदेन का स्पष्ट रूप से उपयोग नहीं कर रहा है, फिर भी एक डेडलॉक है।

  • +0

    एक चुनिंदा ** ** लेनदेन में एक प्रश्न है वैसे भी ... क्योंकि autocommit 1 है। – Pacerier