SQL सर्वर में क्वेरी टाइमआउट के लिए मजबूर करना


79

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

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

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

जवाबों:


131

इसे चलाएं और फिर अपनी प्रविष्टि आज़माएं ...

select * from yourTable with (holdlock,tablockx)

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

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

क्या सी # / नेट से ऐसा करने का एक तरीका है जो बिना थ्रेड को ब्लॉक किए SQL सर्वर को कॉल करता है? मैं कनेक्शन के समय को प्राप्त करते समय अपने आवेदन के व्यवहार का परीक्षण करने की कोशिश कर रहा हूं। लेकिन अगर मैं C # से इस कोड को कॉल करता हूं, तो मुझे नहीं पता कि किसी अन्य क्वेरी को कैसे चलाना है, उद्देश्यपूर्ण रूप से टाइमआउट का अनुभव करना।
जेक स्मिथ

33

लौटने से पहले एक मिनट के लिए रुकने के लिए आप अपने sql कोड को बता सकते हैं:

WaitFor Delay '00:01:00'

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

मैं एक तालिका को आबाद कर रहा था, और जटिल पुनरावर्ती प्रश्न बना रहा था, बफ, बकवास। ये ट्रिक करता है।
डेनियल

10

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

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

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

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

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.