संपादित करें: जैसा कि @MaxVernon बताते हैं, निम्नलिखित कोई रास्ता नहीं है जो NOLOCK का उपयोग करने का एक सुझाव है , और मुझे बहुत अच्छी तरह से लेन-देन के स्तर को निर्धारित करने का उल्लेख करना चाहिए READ UNCOMMITED
और नकारात्मक धारणा NOLOCK
को पहले स्थान पर लाने से रोकना चाहिए । तो मूल रूप से पोस्ट किया गया:
त्वरित और सरल है "हाँ, पहली क्वेरी दूसरी क्वेरी को तब तक अवरुद्ध करेगी जब तक कि एक विशिष्ट सूचकांक संकेत निर्दिष्ट नहीं किया जाता है ( NOLOCK , जिसे कभी-कभी" गंदा रीड "कहा जाता है) या दूसरी क्वेरी का लेन-देन अलगाव स्तर READ UNCOMMITED
(जो पहचान से संचालित होता है) पर सेट होता है। नहीं, यह नहीं है।"
प्रश्न पर प्रदान किए गए अतिरिक्त विवरण के जवाब में , WITH
दूसरे पर एक खंड को शामिल करने के लिए SELECT
, पारस्परिक रूप से अनन्य या अन्यथा, दो प्रश्नों के बीच की बातचीत काफी हद तक समान होगी।
IF NOT EXISTS ( SELECT 1
FROM sys.objects
WHERE name = 'Foo'
AND type = 'U' )
BEGIN
--DROP TABLE dbo.Foo;
CREATE TABLE dbo.Foo
(
Foo_PK BIGINT IDENTITY( 1, 1 ) NOT NULL,
PRIMARY KEY ( Foo_PK ),
Bar BIT,
x BIT,
y BIT,
z BIT
);
CREATE NONCLUSTERED INDEX IX_Foo_x
ON dbo.Foo ( x );
INSERT INTO dbo.Foo ( Bar, x, y, z )
VALUES ( 1, 1, 1, 1 ), ( 0, 0, 0, 0 );
END;
GO
BEGIN TRANSACTION;
UPDATE dbo.Foo
SET y = 0
WHERE x = 1;
-- COMMIT TRANSACTION;
एक अलग सत्र में, निम्नलिखित चलाएँ:
SELECT *
FROM dbo.Foo WITH ( NOLOCK );
GO
SELECT *
FROM dbo.Foo;
आप वर्तमान में चल रहे ताले की जांच कर सकते हैं sp_lock
, अधिमानतः एक और अलग सत्र में:
EXECUTE dbo.sp_lock;
आपको एक KEY
प्रकार का लॉक देखना चाहिए जो कि स्पिड ट्रांज़ेक्शन को स्प्रेड द्वारा आयोजित किया जा रहा है X
(अनन्य) मोड में, अन्य IX
(इंटेंट-एक्सक्लूसिव) लॉक से भ्रमित नहीं होना चाहिए । ताला प्रलेखन इंगित करता है कि, जबकि KEY
ताला रेंज-विशिष्ट है, यह भी अन्य लेनदेन डालने या डेटा बदलकर प्रभावित स्तंभों को अद्यतन करने से रोकता है उसमें इतना है कि यह मूल प्रश्न के उस सीमा के भीतर गिर सकती है निहित। जैसा कि लॉक ही आयोजित किया जा रहा है, अनन्य है, पहली क्वेरी किसी अन्य समवर्ती लेनदेन से संसाधन तक पहुंच को रोक रही है । वास्तव में, कॉलम की सभी पंक्तियाँ लॉक हैं, चाहे वे पहले क्वेरी द्वारा निर्दिष्ट सीमा के भीतर हों या न हों।
S
ताला दूसरे सत्र द्वारा आयोजित किया जा रहा इस प्रकार होगा WAIT
जब तक X
ताला साफ़ करता है, एक और को रोकने X
के लिए (या U
) एक अलग समवर्ती spid से उस संसाधन पर पहुंचने से पहले दूसरे सत्र में अपनी पढ़ा आपरेशन पूरा करता है, के अस्तित्व को न्यायोचित ठहरा से ताला S
ताला।
अब स्पष्टता के लिए एक संपादित करें: जब तक मैं गलत नहीं हूँ कि एक गंदा पढ़ा यहाँ बताए गए जोखिमों के संक्षिप्त विवरण से क्या है ... संपादित करें 3 : मुझे बस एहसास हुआ कि मैं एक पृष्ठभूमि चौकी के प्रभाव पर विचार नहीं कर रहा हूँ, जो इस प्रकार लिखता है डिस्क पर अभी तक बिना किसी लेनदेन के, हां, मेरा स्पष्टीकरण भ्रामक था।
दूसरी क्वेरी में, पहला बैच (और इस मामले में,) बिना डेटा के वापस आ जाएगा। डिफ़ॉल्ट लेनदेन आइसोलेशन स्तर में चल रहा दूसरा बैच, READ COMMITED
पहले सत्र में कमिट या रोलबैक पूरा होने के बाद ही लौटेगा।
यहां से आप अपनी क्वेरी योजनाओं और संबद्ध लॉक स्तरों को देख सकते हैं, लेकिन बेहतर अभी तक, आप SQL सर्वर के सभी लॉक यहां पढ़ सकते हैं ।
SELECT * FROM Table1
यदि यह ठीक है कि मुझे क्या चाहिए, तो यह कैसे बुरा है?