मार्क के जवाब का विस्तार ...
जब क्लाइंट टाइमआउट घटना होती है (उदाहरण के लिए .net कमांडटाइमआउट), क्लाइंट SQL सर्वर को "ABORT" भेजता है। SQL सर्वर तो बस क्वेरी प्रसंस्करण छोड़ देता है। कोई लेन-देन वापस नहीं किया जाता है, कोई भी लॉक जारी नहीं किया जाता है।
अब, कनेक्शन कनेक्शन पूल में वापस आ गया है, इसलिए यह SQL सर्वर पर बंद नहीं है। यदि ऐसा कभी होता है (KILL या क्लाइंट रिबूट आदि के माध्यम से) तो लेनदेन + ताले साफ हो जाएंगे। ध्यान दें कि sp_reset_connection उन्हें स्पष्ट नहीं करेगा या नहीं करेगा, भले ही वह ऐसा करने के लिए विज्ञापित हो
गर्भपात से यह टुकड़ी अन्य प्रक्रियाओं को अवरुद्ध कर देगी।
SQL सर्वर स्पष्ट लेनदेन + क्लाइंट टाइमआउट पर लॉक करने का तरीका (कड़ाई से, संक्षिप्त घटनाओं) SET XACT_REORT ON का उपयोग करना है।
आप यह सत्यापित कर सकते हैं कि SSMS में 2 क्वेरी विंडो खोली जा रही हैं:
विंडो 1:
मेनू में Query..Query विकल्प 5 सेकंड का टाइमआउट सेट करते हैं फिर इसे चलाते हैं
BEGIN TRAN
UPDATE sometable WITH (TABLOCKX) SET foo = foo WHERE 1 = 0;
WAITFOR DELAY '00:00:10' -- just has to be longer then timeout
विंडो 2, यह हमेशा के लिए प्रतीक्षा करेगा (या आपके टाइमआउट को हिट करेगा)
SELECT * FROM sometable
SET XACT_ABORT ON के दिलचस्प दुष्प्रभाव भी हैं:
- @@ TRANCOUNT को निहित रोलबैक पर शून्य पर सेट किया गया है लेकिन त्रुटि 266 को दबा दिया गया है (ऐसा तब होता है यदि @@ TRANCOUNT प्रविष्टि और संग्रहित संग्रह से बाहर है)
- XACT_STATE -1 होगा (यह "बर्बाद" है)
इसके संयोजन का मतलब है कि आप आंशिक कमिट / रोलबैक के लिए SAVEPOINTS (हालांकि, मैं सटीक व्यवहार को याद नहीं कर सकते) का उपयोग नहीं कर सकते। जो मुझे सूट करे
SET XACT_ABORT पर SO लिंक:
नेस्टेड संग्रहीत प्रोक्स पर:
Sp_reset_connection पर: