2010-05-02 16 views
7

मैंने एक मालिकाना गैर-एसक्यूएल डीबी का उपयोग करके एक प्रोजेक्ट पर काम किया है जहां प्रश्नों को बाधित किया जा सकता है और कोडबेस में वहां कुछ स्पॉट थे जहां कार्यक्षमता का उपयोग किया गया था और सही अर्थ बनाया गया था (उदाहरण के लिए रोकने के लिए एक लंबी चल रही क्वेरी जो उपयोगकर्ता द्वारा रद्द की जाती है, या जब कोई और हालिया क्वेरी होती है और पिछली क्वेरी अप्रचलित, आदि प्रस्तुत करती है) और मुझे एहसास हुआ कि मैंने वास्तव में उस तरह के "बाधित प्रश्न" को कभी नहीं देखा और सोचा कि यह एक अच्छा SO प्रश्न (कई प्रश्न, लेकिन वे सभी एक ही चीज़ से संबंधित हैं):एसक्यूएल: एक क्वेरी को बाधित करना

  • क्या SQL क्वेरी बाधित हो सकती हैं?

  • एसक्यूएल मानक का यह हिस्सा है?

  • यदि यह SQL मानक का हिस्सा नहीं है, जो SQL डीबी क्वेरी को बाधित करने की अनुमति देता है (कोई उदाहरण सबसे स्वागत है)?

  • क्या डीबी क्वेरी (एसक्यूएल या नहीं) को बाधित करना आम बात है जिसे आप जानते होंगे कि आपको अब परिणाम की परवाह नहीं होगी? (Codebase मैं पर काम किया है, यह सुनिश्चित करें कि सर्वर लोड को हल्का करने में मदद करता)

उत्तर

6

IMHO "बाधित" द्वारा 'को मार डाला' या 'समाप्त' बदला जाना चाहिए। हस्तक्षेप की अवधारणा भ्रमित हो सकती है क्योंकि कोई यह अनुमान लगा सकता है कि यह बाद में क्वेरी को फिर से शुरू करने की अनुमति देगा।

एसक्यूएल मानक एक चलती क्वेरी को बाधित या समाप्त करने का कोई तरीका नहीं प्रदान करता है, लेकिन मुझे पता है कि प्रत्येक डीबीएमएस एक किल-कमांड या इसी तरह लागू करता है। उदाहरण के लिए, MySQL में कोई उपयोगकर्ता सभी चल रहे प्रश्नों (और उनके राज्य, क्वेरी आईडी इत्यादि) को देखने के लिए SHOW [FULL] PROCESSLIST का उपयोग कर सकता है। किल विशेषाधिकार वाले उपयोगकर्ता तब एक क्वेरी समाप्त कर सकते हैं।

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

4

सभी आरडीबीएमएस एक्सेस लेयर I ' असीमित रूप से चल रहे प्रश्नों को रद्द करने के लिए रद्दीकरण विधि प्रदान करने के साथ कभी भी काम किया है। आप जिस डेटा एक्सेस प्रौद्योगिकी स्टैक का उपयोग कर रहे हैं, उसके लिए प्रलेखन देखें। .NET/ADO/JDBC एक 'रद्द करें' विधि प्रदान करते हैं। ओडीबीसी - एसक्यूएल कैंसल। स्पष्ट रूप से अंतर्निहित आरडीबीएमएस विक्रेताओं डेटा एक्सेस ड्राइवर को विधि को भी लागू करना होगा।

रद्दीकरण की उपयोगीता के मामले में मैं नियमित रूप से इसका उपयोग करने वाली किसी भी योजना की आलोचना करता हूं। मेरी राय में बेहतर समन्वय और डिजाइन गैर-प्रशासनिक आवश्यकता को कम करने के लिए प्रवृत्त होगा।

आरडीबीएमएस के आंतरिक, लेनदेन की प्रकृति और अलगाव योजना पर महत्वपूर्ण निर्भरता है। यदि आरडीबीएमएस एक आशावादी समरूपता मॉडल का उपयोग करता है (यानी प्रतिबद्धता अनिवार्य रूप से मुक्त है) एक चल रही क्वेरी को रद्द करने में संभावित रूप से महंगा रोलबैक ऑपरेशन शामिल हो सकता है। सबसे बुरे मामले में रद्दीकरण के बिंदु तक एक घंटे तक चलने वाली एक क्वेरी रोलबैक के लिए एक और घंटे लग सकती है।

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