2009-04-28 5 views
65

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

हमें टाइमआउट नहीं मिल सकता है। मैंने एसक्यूएल एमजीएमटी स्टूडियो से एक लेनदेन खोला है और उन्हें लॉक करने के लिए हर पंक्ति को अपडेट किया है, लेकिन इससे आईएनएसईआरटी को टाइमआउट (जो मुझे चाहिए) का कारण नहीं बनता है।

क्या मुझे टी-एसक्यूएल के माध्यम से आसानी से टेबल-स्तर लॉक मिल सकता है? या मुझे मास्टर में चारों ओर झुकाव करना है? या मैं आसानी से लॉकिंग के बिना टाइमआउट को मजबूर कर सकता हूं? किसी भी इनपुट की सराहना की है।

उत्तर

102

रन इस और फिर अपने डालने की कोशिश ...

select * from yourTable with (holdlock,tablockx) 
यहाँ

, आप 5 मिनट के लिए उसे लॉक कर सकते हैं:

BEGIN TRANSACTION 

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK) 

WHERE 0 = 1 

WAITFOR DELAY '00:05' 

ROLLBACK TRANSACTION 
19

तुम बस एक मिनट के लिए प्रतीक्षा करने के लिए अपने एसक्यूएल कोड बता सकते हैं लौटने से पहले:

WaitFor Delay '00:01:00' 
+0

उत्तर की सादगी के लिए वोट दिया गया। मैंने इसका परीक्षण किया है और यह – Mikel

+0

काम करता है मैं एक टेबल पॉप्युलेट कर रहा था, और जटिल रिकर्सिव क्वेरीज, बफ, बकवास बना रहा था। ये चाल है। – DanielV

4

इस ब्लॉग पोस्ट को देखें। असल में SQL सर्वर में क्वेरी टाइमआउट नहीं है। ग्राहक एसक्यूएल टाइमआउट लागू कर सकते हैं लेकिन इंजन स्वयं नहीं करता है।

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx

8

टिप तरफ: यदि कनेक्शन विन्यास योग्य है, 1 सेकंड के लिए कनेक्शन स्ट्रिंग टाइमआउट को कम - कि यह आसान हो जाएगा। तालिका के डेटा के साथ तालिका भरें और लूप के चारों ओर एक लेनदेन के साथ उस तालिका के एक लूप अद्यतन भाग में 3 अन्य प्रक्रियाएं स्पिन करें। ऐप द्वारा बुलाए गए वास्तविक प्रक्रिया को न बदलें (प्रतीक्षा करें इंजेक्शन)। यह एकीकरण परीक्षण को अमान्य करता है।

लेकिन वास्तव में, यह पक्ष इकाई परीक्षण और निर्भरता इंजेक्शन में एक केस अध्ययन है। कुछ चीजें एकीकरण परीक्षण के लिए मुश्किल हैं। यूनिट परीक्षण + dependency injection

  • वास्तविक: कोड जो क्रेप्स -> डेटाबेस टाइमआउट (पुन: पेश करने में कठोर)।
  • Refactor: कोड है कि क्रेप्स -> भंडार (करता है डेटा का उपयोग केवल) -> डाटाबेस
  • यूनिट परीक्षण: कोड है कि क्रेप्स>Mock repository फेंकने के लिए -> अशक्त
  • अब आप कोड के लिए एक असफल परीक्षण है कि क्रेप्स और इसे ठीक कर सकते हैं।

यह "निर्भरता" इंजेक्शन है। देव डेटाबेस पर निर्भरता को इंजेक्ट कर सकता है, जो किसी निर्भरता के व्यवहार को अनुकरण करता है। सभी डेटाबेस परीक्षणों के लिए अच्छा करना है। वैसे भी, इकाई परीक्षण के साथ, आप जानते हैं कि फिक्स इस प्रकार की तरह करता है, लेकिन आपको अभी भी एकीकरण परीक्षण की आवश्यकता है। इस मामले में, यह रिग्रेशन पर बेहतर ध्यान केंद्रित कर सकता है - जिसका मतलब है कि इसका परीक्षण करने से कुछ और नहीं टूट गया और सुविधा अभी भी काम करती है।

आपने पहले ही अपना पैच बनाया है, इसलिए मुझे लगता है कि मेरा जवाब बहुत देर हो चुकी है।