2009-11-11 9 views
6

यदि मैं एसक्यूएल कॉमांड और एसक्यूएल कॉमांड टाइम का उपयोग करके एक संग्रहित प्रो चलाता हूं तो स्टोर्डप्रोक निष्पादित करना जारी रखता है या एसक्यूएल कॉमांड डिस्कनेक्ट होने पर इसे छोड़ने के लिए मजबूर हो जाता है?संग्रहीत प्रो और एसक्यूएल कॉमांड टाइमआउट

उत्तर

3

मेरी वृत्ति ने कहा कि प्रक्रिया अभी भी निष्पादित होगी इसलिए मैंने एक साधारण परीक्षण को एक साथ फेंक दिया।

एसक्यूएल:

Create Procedure TestDelay 
AS 

waitfor delay '00:00:40' 

update table_1 
set dt = getdate() 

और VB.Net (इस उद्देश्य के लिए सी # के रूप में ही) में:

Dim con As New SqlConnection(myconnectionstring) 
    Dim com As New SqlCommand("TestDelay", con) 
    com.CommandType = CommandType.StoredProcedure 
    con.Open() 
    Try 
     com.ExecuteNonQuery() 
    Catch ex As Exception 
     con.Close() 
     Response.Write(ex.Message) 
    End Try 

परिणाम? प्रक्रिया समय समाप्ति के बाद पूरा नहीं हुआ। मैंने एसक्यूएल प्रोफाइलर में एक ट्रेस के दौरान क्या हो रहा था और यह सुनिश्चित किया कि लेनदेन में कॉल को लपेटने के लिए पर्याप्त एसक्यूएल दिखाई देता है और उस लेनदेन को टाइमआउट पर वापस रोल करना होगा।

नोट: यह परीक्षण SQL 2005 के विरुद्ध चलाया गया था, लेकिन मुझे लगता है कि परिणाम अन्य संस्करणों में समान होंगे।

+0

सही है, एसक्यूएल से 7 कम से कम वापस – gbn

1

जैसा कि ब्रेंडन ने कहा, क्लाइंट "निरस्त" भेजता है और प्रसंस्करण मृत हो जाता है। इतना सरल है।

हालांकि, यह है कि तुलना में अधिक जटिल है ...

किसी भी लेन-देन वापस डिफ़ॉल्ट रूप से लुढ़का नहीं कर रहे हैं और ताले सिर्फ वहाँ जब तक कनेक्शन बंद कर दिया है छोड़ दिया जाता है। यदि कनेक्शन पूल में वापस आ गया और पुन: उपयोग किया गया, तो यह बंद होने के रूप में नहीं गिना जाता है।

यही कारण है कि SET XACT_ABORT ON (अन्य प्रश्न SO1, SO2) की सिफारिश की है

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