जब मैंने एक क्वेरी देखी, जो कुछ इस तरह दिख रही थी, तो मैं कुछ अवरोध की जाँच कर रहा था:
SELECT SomeField FROM SomeTable NOLOCK
मैंने देखा NOLOCK
और उत्सुक था कि इस मामले में अन्य प्रश्नों को कैसे रोका जा सकता है DELETE
। मैंने तालों का उपयोग करके त्वरित रूप से sp_lock
देखा और यहाँ मैंने जो देखा वह है:
DB S GRANT
TAB IS GRANT
PAG S GRANT
अब, मेरी समझ यह है कि NOLOCK
केवल स्कीमा-स्टेबिलिटी लॉक लेना चाहिए, तो फिर आईएस लॉक को क्यों पकड़ा गया?
मेरी जिज्ञासा शांत हुई। मैंने बीओएल में देखा और देखा कि इसका उपयोग करने के दो तरीके हैं, WITH (NOLOCK)
और पदावनत (NOLOCK)
, इसलिए मैंने उन लोगों को देने का फैसला किया। मैंने निम्नलिखित प्रश्नों को चलाकर पीछा किया sp_lock
:
SELECT SomeField FROM SomeTable WITH (NOLOCK)
DB S GRANT TAB SCH-S GRANT
SELECT SomeField FROM SomeTable (NOLOCK)
DB S GRANT TAB SCH-S GRANT
निश्चित रूप से पर्याप्त, मेरे स्कीमा-स्थिरता ताले हैं। तो मेरा सवाल यह है: यहाँ क्या हो रहा है? यदि NOLOCK का उपयोग करने के लिए स्वीकृत सिंटैक्स WITH (NOLOCK)
या तो है (NOLOCK)
, तो जब यह केवल सादे NOLOCK
(कोष्ठक के बिना) के साथ चलता है तो क्वेरी त्रुटि क्यों नहीं है ? अगर यह समर्थित है, तो आईएस ताला क्यों पकड़ रहा है? मुझे यहां क्या समझ नहीं आ रहा है? मैं एक उत्तर के लिए ऑनलाइन खोज कर रहा हूं, लेकिन अभी तक कम आया है।
मैंने इसका परीक्षण 2008R2 और 2012 दोनों में किया है।
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)
डबल