2010-11-30 19 views
8

मैं है उत्पन्न जब मैं सी # में एसक्यूएल डेटाबेस से डेटा प्राप्त करने की कोशिश इन दो अपवाद:SqlException: गतिरोध

System.Data.SqlClient.SqlException: लेन-देन (प्रक्रिया ID 97) दूसरे के साथ ताला संसाधनों पर deadlocked किया गया था प्रक्रिया और डेडलॉक पीड़ित के रूप में चुना गया है।

या

System.Data.SqlClient.SqlException: लेन-देन (प्रक्रिया ID 62) किसी अन्य प्रक्रिया के साथ ताला संसाधनों पर deadlocked किया गया था और गतिरोध शिकार के रूप में चुना गया है।

या

System.Data.SqlClient.SqlException: लेन-देन (प्रक्रिया ID 54) किसी अन्य प्रक्रिया के साथ ताला संसाधनों पर deadlocked किया गया था और गतिरोध शिकार के रूप में चुना गया है। लेनदेन फिर से करें।

using (SqlConnection con = new SqlConnection(datasource)) 
       { 
        SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con); 
        cmd.CommandTimeout = 300; 
        con.Open(); 
        SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
        DataSet ds = new DataSet(); 
        adapter.Fill(ds); 
        con.Close(); 
        return ds.Tables[0]; 
       } 

ये hapened Evry समय:

इस

कोड है।

कोई विचार यह कैसे हल किया जा सकता है?

+2

क्या आपको यह अपवाद एक बार मिला था या जब भी आप कोशिश करते हैं तो ऐसा होता है? –

+3

क्या आप अपनी क्वेरी दिखा सकते हैं? –

+0

जब भी मैं कोशिश करता हूं ये हर बार झुकता है। –

उत्तर

7

ऐसा नहीं है कि इस गतिरोध मुद्दा मदद करने के लिए जा रहा है, लेकिन आप अपने अन्य IDisposable वस्तुओं बहुत पसंद आप इस तरह के रूप में अपने SqlConnection निपटाने रहे निपटान किया जाना चाहिए:

using (SqlConnection con = new SqlConnection(datasource)) 
    using (SqlCommand cmd = new SqlCommand("Select * from MyTable Where ID='1' ", con)) 
    { 
     cmd.CommandTimeout = 300; 
     con.Open(); 
     using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
     using (DataSet ds = new DataSet()) 
     { 
      adapter.Fill(ds); 
      return ds.Tables[0]; 
     } 
    } 

आप से बचने के लिए सक्षम हो सकता है इस प्रकार आपकी क्वेरी में लॉकिंग संकेत के साथ लॉक:

Select * from MyTable with (nolock) Where ID='1' 

आशा है कि इससे मदद मिलती है।

3

असल में, SQL सर्वर समरूपता मॉडल इसे बनाता है ताकि आप कभी भी इस अपवाद से बच सकें (उदाहरण के लिए। यदि वे एक ही इंडेक्स पेज या किसी चीज़ को लॉक करते हैं तो पूरी तरह से असंबंधित लेन-देन एक दूसरे को अवरुद्ध कर सकता है)। सबसे अच्छा आप कर सकते हैं संभावनाओं को कम करने के लिए अपने लेनदेन को कम रखें, और यदि आपको अपवाद मिलता है, तो जो भी कहता है वह करें और लेनदेन का पुनः प्रयास करें।

+0

आप अवरुद्ध करने और डेडलॉकिंग की अवधारणाओं को भ्रमित कर रहे हैं। यह सच नहीं है कि यह अपवाद अपरिहार्य है। –

+0

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

16

कुछ ऐसी चीजें हैं जो आप प्राप्त करने वाले डेडलॉक्स की संख्या को कम करने के लिए कर सकते हैं, और कुछ चीजें जिन्हें आप पूरी तरह खत्म करने के लिए कर सकते हैं।

सबसे पहले, SQL सर्वर प्रोफाइलर लॉन्च करें और इसे deadlock graph देने के लिए कहें। इस ट्रेस को चलाने से आपको अन्य क्वेरी बताएगी जो आपके साथ विवादित है। आपकी क्वेरी काफी सरल है, हालांकि मुझे गंभीरता से संदेह है कि आपके पास SELECT * आपके सिस्टम में माईटेबल नामक एक टेबल से पूछताछ है ...

वैसे भी, डेडलॉक ग्राफ और अन्य क्वेरी के साथ सशस्त्र, आपको यह बताने में सक्षम होना चाहिए कि कौन से संसाधन deadlocking हैं। क्लासिक समाधान दोनों प्रश्नों के क्रम को बदलने के लिए है जैसे कि संसाधनों को उसी क्रम में एक्सेस किया जाता है - यह चक्र से बचाता है।

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

  • स्पीड अप, उन्हें सही अनुक्रमित लागू करने।
  • डेटाबेस पर स्नैपशॉट अलगाव सक्षम करें और उचित रूप से अपने लेनदेन में SET TRANSACTION ISOLATION LEVEL SNAPSHOT का उपयोग करें। read committed with row-versioning भी सक्षम करें। कई मामलों में, यह पूरी तरह से अधिकांश deadlocks को खत्म करने के लिए पर्याप्त है। लेनदेन अलगाव स्तर के बारे में पढ़ें। Understand आप क्या कर रहे हैं।