8

का उपयोग कर अपने मौजूदा आवेदन में बिना .NET अनुप्रयोग से एसक्यूएल सर्वर समय समाप्ति का पता लगाने के, मैं T-SQL अद्यतन आदेश लागू द्वारा एक अद्यतन प्रदर्शन कर रहा हूँ। समस्या तब होती है जब उस समय अन्य उपयोगकर्ताओं द्वारा एक ही रिकॉर्ड लॉक किया जाता है।कैसे पकड़ अपवाद

.NET अनुप्रयोग में आवेदन जब तक एसक्यूएल सर्वर टाइमआउट इंतजार करेंगे, तो यह SqlException टाइमआउट फेंक देते हैं।

यह नहीं बल्कि अपवाद को पकड़ने से पहले एक जाँच करने के लिए एक विशेष रिकॉर्ड अन्य प्रक्रिया द्वारा बंद कर दिया गया है या नहीं संभव है?

उत्तर

22

नहीं, वास्तव में नहीं।

try 
    { 
     // do stuff... 
    } 
    catch (SqlException sqlEx) 
    { 
     switch (sqlEx.Number) 
     { 
      case -2: // Client Timeout 
      case 701: // Out of Memory 
      case 1204: // Lock Issue 

      case 1205: // >>> Deadlock Victim 
       // handle deadlock 
       break; 

      case 1222: // Lock Request Timeout 
      case 2627: // Primary Key Violation 
      case 8645: // Timeout waiting for memory resource 
      case 8651: // Low memory condition 
      ... 
     } 
    } 

[नोट: ब्रेक बयान सघनता के लिए नहीं जोड़ा

यह भी ध्यान रखें

मानक तरीका try/catch उपयोग करने के लिए और संभाल SqlException संख्या 1205 (गतिरोध शिकार), और आपकी क्वेरी पुन: प्रयास है , उचित लॉकिंग मुद्दों को उचित कवर इंडेक्स प्रदान करके समाप्त किया जा सकता है।

0

आप बहुत ही कम समय समाप्ति के साथ अलग से कनेक्शन का उपयोग कुछ क्षेत्र को अपडेट करके रिकॉर्ड लॉक करने के लिए प्रयास करने के लिए कर सकता है, लेकिन यह अभी भी नहीं आप 100% विश्वसनीयता देने के लिए जा रहा है।

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

इसके अलावा, सुनिश्चित करें कि आप उन पर सभी रिकॉर्ड बंद करने की अनुमति नहीं है। दूसरे शब्दों में, लॉकिंग केवल अपडेट के थोड़े समय के लिए होगी (< 100 एमएस)

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