2013-05-16 3 views
10

मान लीजिए कि मैं लंबे समय से चल रहे SQL सर्वर संग्रहीत प्रक्रिया को चलाने के लिए C# का उपयोग करता हूं (30 मिनट कहें)। और मान लीजिए कि मैंने सी # में क्वेरी पर 1 घंटे की टाइमआउट अवधि लगाई है, अगर किसी भी कारण से एसपी उम्मीद से अधिक समय लेता है, तो मैं डीबी एकाधिकार को समाप्त नहीं करता हूं। अंत में, मान लीजिए कि इस संग्रहित प्रक्रिया में त्रुटियों को पकड़ने के लिए इसमें एक कोशिश/पकड़ ब्लॉक है और कुछ साफ-सफाई करना इसके अंदर कोई भी कदम विफल होना चाहिए।SQL सर्वर एक समयबद्ध अनुरोध के साथ क्या करता है?

कुछ कोड (सी #):

using (SqlCommand comm = new SqlCommand("longrunningstoredproc")) 
{ 
    comm.Connection = conn; 
    comm.CommandType = CommandType.StoredProcedure; 
    comm.CommandTimeout = 3600; 
    comm.ExecuteNonQuery(); 
} 
/* Note: no transaction is used here, the transactions are inside the stored proc itself. */ 

T-SQL (मूल रूप से के लिए राशि के बाद):

BEGIN TRY 
    -- initiailize by inserting some rows into a working table somewhere 
    BEGIN TRANS 
    -- do long running work 
    COMMIT TRANS 
    BEGIN TRANS 
    -- do long running work 
    COMMIT TRANS 
    BEGIN TRANS 
    -- do long running work 
    COMMIT TRANS 
    BEGIN TRANS 
    -- do long running work 
    COMMIT TRANS 
    BEGIN TRANS 
    -- do long running work 
    COMMIT TRANS 
    -- etc. 

    -- remove the rows from the working table (and set another data point to success) 
END TRY 
BEGIN CATCH 
    -- remove the rows from the working table (but don't set the other data point to success) 
END CATCH 

मेरा प्रश्न है, एसक्यूएल सर्वर जब आदेश क्वेरी के साथ क्या करेंगे सी # पक्ष से बाहर समय? क्या यह एसपी के कैच ब्लॉक का आह्वान करेगा, या क्या यह पूरी तरह से इसे बंद कर देगा जैसे कि मुझे सी # कोड में क्लीन-अप करने की आवश्यकता होगी?

+0

आदेश सी # साइट से टाइम आउट नहीं होगा:

यहाँ इस के लिए संदर्भ है। सी # कोड पर इसका कोई नियंत्रण नहीं है (उसने डीबी को 1 घंटे के बाद टाइमआउट करने के लिए कहा, और डीबी बस यही करता है)। – Oded

उत्तर

5

टाइमआउट ADO.NET द्वारा लागू किया जाता है। एसक्यूएल सर्वर कमांड टाइमआउट के रूप में ऐसी चीज नहीं जानता है। .NET क्लाइंट एक "ध्यान" टीडीएस कमांड भेज देगा। आप इस व्यवहार को एसक्यूएल प्रोफाइलर के साथ देख सकते हैं क्योंकि इसमें "ध्यान" घटना है।

जब SQL सर्वर रद्दीकरण प्राप्त करता है तो यह वर्तमान में चल रही क्वेरी को रद्द कर देगा (जैसे कि जब आप स्टॉप बटन दबाते हैं तो एसएसएमएस करता है)। यह बैच को रोक देगा (बस एसएसएमएस की तरह)। इसका मतलब है कि कोई पकड़ कोड चलाया जा सकता है। कनेक्शन जिंदा रहेगा।

मेरे अनुभव में लेनदेन तुरंत वापस लुढ़का जाएगा। मुझे नहीं लगता कि यह गारंटी है हालांकि।

टीएल; डीआर: एडीओ.NET में एक टाइमआउट वही व्यवहार करता है जैसे आपने एसएसएमएस में स्टॉप दबाया था (या SqlCommand.Cancel कहा जाता है)। - डेटाबेस उसका समय होगा http://blogs.msdn.com/b/psssql/archive/2008/07/23/how-it-works-attention-attention-or-should-i-say-cancel-the-query-and-be-sure-to-process-your-results.aspx

3

टाइमआउट कुछ ऐसा होता है जो कनेक्शन पर होता है, न कि चलती क्वेरी।

इसका मतलब है कि आपके BEGIN CATCH टाइमआउट की स्थिति में निष्पादित नहीं होंगे, क्योंकि क्वेरी को इसके बारे में कोई जानकारी नहीं है।

catch(SqlException ex) ब्लॉक (एक टाइमआउट के लिए परीक्षण) में सी # में अपना क्लीनअप लिखें।

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