(NOLOCK) बनाम NOLOCK


24

जब मैंने एक क्वेरी देखी, जो कुछ इस तरह दिख रही थी, तो मैं कुछ अवरोध की जाँच कर रहा था:

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 दोनों में किया है।


4
SELECT SomeField FROM SomeTable NOLOCK (NOLOCK)डबल
नोलॉक

जवाबों:


52
SELECT SomeField
FROM   SomeTable NOLOCK 

इसका मतलब है कि आपने अभी-अभी अलियास किया है SomeTable AS NOLOCK। इसे स्पष्ट रूप से देखने के लिए नीचे का प्रयास करें:

SELECT NOLOCK.SomeField
FROM   SomeTable NOLOCK 

यह स्पष्ट रूप से क्वेरी के लॉकिंग व्यवहार पर कोई प्रभाव नहीं है। क्वेरी विफल नहीं होती है क्योंकि SSMS में कीवर्ड और ब्लू दिखाने के बावजूद, NOLOCK Transact-SQL में एक आरक्षित शब्द नहीं है और इसलिए सिंटैक्स त्रुटि का कारण नहीं बनता है। आरक्षित शब्दों की सूची: https://msdn.microsoft.com/en-us/library/ms189822.aspx

संकेत के रूप में उपयोग करने के लिए सही सिंटैक्स:

  • (NOLOCK) मान्य है लेकिन पदावनत।
  • WITH (NOLOCK) अनुशंसित सिंटैक्स है।

14
वाह, मुझे यकीन नहीं है कि मैंने यह कैसे पता लगाया। यह वास्तव में मुझे पागल कर रहा था, अब मुझे बस शर्मिंदगी महसूस होती है :) यह कभी-कभी सबसे सरल चीजें हैं, मुझे लगता है।
ब्रायन

2
@ ब्रायन कोई चिंता नहीं है, मुझे हाल ही में कुछ इसी तरह की बहस करनी पड़ी थी, नहीं तो यह इतना आसान नहीं होता! आप देख सकते हैं कि एमएस ने उस वाक्य रचना को क्यों चित्रित किया है।
गारेथ लियोन्स

क्या NOLOCK आरक्षित कीवर्ड नहीं है? यदि आप [NOLOCK] का उपयोग नहीं करते हैं तो क्या यह शिकायत नहीं होनी चाहिए?
एरोनिनस

6
Nope msdn.microsoft.com/en-us/library/ms189822.aspx हालांकि यह SSMS में नीले रंग में दिखाई देता है जो आपको फेंक सकता है।
गारेथ लियोन्स

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