SELECT
NOLOCK
. के साथ क्वेरीज़ वास्तव में कोई ताला नहीं है, उन्हें अभी भी एक SCH-S
. की आवश्यकता है (स्कीमा स्थिरता) टेबल पर लॉक (और जैसा कि यह एक है ढेर यह एक hobt
भी लेगा ताला
)
इसके अतिरिक्त SELECT
. से पहले SQL सर्वर को स्टेटमेंट के लिए एक योजना संकलित करनी चाहिए, जिसके लिए इसे SCH-S
लेने की भी आवश्यकता होती है। मेज पर ताला लगाओ।
चूंकि आपका लंबे समय तक चलने वाला लेन-देन SELECT ... INTO
. के माध्यम से तालिका बनाता है इसमें एक असंगत SCH-M
है स्टेटमेंट पूरा होने तक इसे लॉक करें।
आप इसे sys.dm_os_waiting_tasks
. में देख कर सत्यापित कर सकते हैं <स्ट्राइक>जबकिस्ट्राइक> <स्ट्राइक>जबकिस्ट्राइक> अवरुद्ध करने की अवधि के दौरान।
जब मैंने एक कनेक्शन में निम्नलिखित की कोशिश की
BEGIN TRAN
SELECT *
INTO NewT
FROM master..spt_values
/*Remember to rollback/commit this later*/
और फिर क्रियान्वित करना (या केवल अनुमानित निष्पादन योजना को देखने का प्रयास करना)
SELECT *
FROM NewT
WITH (NOLOCK)
एक सेकंड में रीडिंग क्वेरी ब्लॉक कर दी गई।
SELECT wait_type,
resource_description
FROM sys.dm_os_waiting_tasks
WHERE session_id = <spid_of_waiting_task>
दिखाता है कि प्रतीक्षा प्रकार वास्तव में है SCH_S
और अवरुद्ध संसाधन SCH-M
wait_type resource_description
---------------- -------------------------------------------------------------------------------------------------------------------------------
LCK_M_SCH_S objectlock lockPartition=0 objid=461960722 subresource=FULL dbid=1 id=lock4a8a540 mode=Sch-M associatedObjectId=461960722