SQL सर्वर ट्रांज़ैक्शन टाइमआउट


9

SQL Server 2008 R2 में एक तरीका है जो एक लेनदेन को शामिल करने वाले डेटाबेस संशोधन के लिए समयबाह्य है? हमारे पास एक ऐसा परिदृश्य है जहां हमारा एप्लिकेशन कोड लटका हुआ है या अपवाद फेंकता है और रोलबैक या कमिट करने में विफल रहता है। इसके बाद लेन-देन के पूरा होने के इंतजार में अन्य सत्र लटक जाते हैं।

जवाबों:


20

मार्क के जवाब का विस्तार ...

जब क्लाइंट टाइमआउट घटना होती है (उदाहरण के लिए .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 पर:


भविष्य कहता है हाय! "ध्यान दें कि sp_reset_connection उन्हें स्पष्ट नहीं करेगा या नहीं करेगा, भले ही वह ऐसा करने के लिए विज्ञापित हो" - मुझे विश्वास नहीं होता कि यह SQL सर्वर के अप-टू-डेट संस्करणों में अब सच है?
kamilk

11

मैं झिझक के साथ इसका उत्तर दे रहा हूं क्योंकि समस्या के आपके विवरण में 100% होने के लिए पर्याप्त जानकारी नहीं है यह सुनिश्चित करना सबसे अच्छी सलाह है। "हैंग या एक अपवाद फेंकता है" बताता है कि समस्या का स्रोत ठीक से समझा नहीं गया है, इसलिए सावधानी से आगे बढ़ें।

इसका सरलतम उपाय शायद यही है SET XACT_ABORT ON

XACT_ABORTयह निर्धारित करता है कि रन-टाइम त्रुटि की स्थिति में SQL सर्वर ट्रांजेक्शन को रोलबैक करेगा या नहीं। डिफ़ॉल्ट SET XACT_ABORT OFFकेवल उस कथन को रोलबैक करेगा जो किसी भी माता-पिता के लेन-देन को खुला छोड़ने में त्रुटि का कारण बना।

डिफ़ॉल्ट सेटिंग का "गेटा" साइड-इफ़ेक्ट यह है कि टाइमआउट वास्तव में एक ही समस्या पैदा कर सकता है, एक खुला लेनदेन जो ग्राहकों को संभालने और रोलबैक करने की जिम्मेदारी है। यदि ग्राहक कोशिश नहीं करता / पकड़ता / रोलबैक करता है, तो लेन-देन तब तक खुला रहेगा, जब तक वह (और मैं @ जीबीएन) को अल्ट्रा-वायलेंस के साथ भाग नहीं लेता KILL <spid>

SQL सर्वर में त्रुटि से निपटने पर Erland Sommarskog के लेखों के हवाले से लिखा गया है कि इन परिदृश्यों और अधिक से निपटने के लिए आपके पास सभी पृष्ठभूमि और रणनीति हैं।

संपादित करें (टिप्पणी के बाद): खुले लेनदेन की पहचान करने के लिए, sp_whoisactive शायद सबसे अधिक विशेषता पूर्ण है।


मैंने पाया कि कुछ Googling के साथ हैंग होने के दौरान खुले लेनदेन को खोजने के तरीके - शायद यह सबसे अच्छा समाधान है। यह पता लगाना है कि कोड में मौजूद लेन-देन का क्या कारण है और कोड में छेद को ठीक करना है। दूसरों के लिए संदर्भ के लिए। DBCC OPENTRAN सबसे पुराना सक्रिय लेनदेन लौटाता है -> msdn.microsoft.com/en-us/library/ms182792.aspx या ऐसा कुछ और? -> weblogs.sqlteam.com/mladenp/archive/2008/04/29/…
डेविड ग्रे राइट

मैंने हमेशा सोचा है कि एरलैंड ने SET XACT_ABORT sommarskog.se/error-handling-I.html#XACT_ABORT
gbn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.