एक SELECT
SQL सर्वर में एक साझा लॉक रखेगा एक टेबल पंक्ति पर - और दूसरा SELECT
एक साझा लॉक की भी आवश्यकता होगी, और वे एक दूसरे के साथ संगत हैं।
तो नहीं - एक SELECT
दूसरे को ब्लॉक नहीं कर सकता SELECT
।
क्या WITH (NOLOCK)
क्वेरी संकेत का उपयोग उस डेटा को पढ़ने में सक्षम होने के लिए किया जाता है जो सम्मिलित होने की प्रक्रिया में है (दूसरे कनेक्शन द्वारा) और जो अभी तक प्रतिबद्ध नहीं है।
उस क्वेरी संकेत के बिना, एक SELECT
चल रहे INSERT
. द्वारा किसी तालिका को पढ़कर अवरोधित किया जा सकता है (या UPDATE
) कथन जो एक अनन्य . रखता है पंक्तियों (या संभवतः एक पूरी तालिका) पर लॉक करें, जब तक कि उस ऑपरेशन का लेन-देन नहीं किया गया हो (या वापस ले लिया गया हो)।
WITH (NOLOCK)
की समस्या संकेत है:हो सकता है कि आप उन डेटा पंक्तियों को पढ़ रहे हों, जिन्हें अंत में सम्मिलित नहीं किया जा रहा है (यदि INSERT
लेन-देन वापस लुढ़का हुआ है) - तो आपका उदा। रिपोर्ट डेटा दिखा सकती है जो वास्तव में डेटाबेस के लिए कभी प्रतिबद्ध नहीं है।
एक और क्वेरी संकेत है जो उपयोगी हो सकता है - WITH (READPAST)
. यह SELECT
. को निर्देश देता है केवल उन पंक्तियों को छोड़ने का आदेश दें जिन्हें वह पढ़ने का प्रयास करता है और जो विशेष रूप से बंद हैं। SELECT
अवरुद्ध नहीं होगा, और यह किसी भी "गंदे" अन-प्रतिबद्ध डेटा को नहीं पढ़ेगा - लेकिन यह कुछ पंक्तियों को छोड़ सकता है, उदा। तालिका में अपनी सभी पंक्तियां न दिखाएं।