UPDLOCK, HOLDLOCK के बारे में उलझन


89

टेबल संकेत के उपयोग पर शोध करते समय , मुझे ये दो प्रश्न मिले:

दोनों सवालों के जवाब में कहा गया है कि उपयोग करते समय (UPDLOCK, HOLDLOCK), अन्य प्रक्रियाएं उस तालिका पर डेटा नहीं पढ़ पाएंगी, लेकिन मैंने यह नहीं देखा। परीक्षण करने के लिए, मैंने एक तालिका बनाई और दो एसएसएमएस खिड़कियां शुरू कीं। पहली खिड़की से, मैंने एक लेन-देन चलाया जो तालिका से विभिन्न तालिका संकेत का उपयोग करके चुना गया था। जब लेन-देन चल रहा था, तो दूसरी विंडो से मैंने यह देखने के लिए विभिन्न बयान चलाए कि कौन सा ब्लॉक किया जाएगा।

परीक्षण तालिका:

CREATE TABLE [dbo].[Test](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

SSMS विंडो 1 से:

BEGIN TRANSACTION

SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'

COMMIT TRANSACTION

SSMS विंडो 2 से (निम्न में से एक चलाया):

SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'

विंडो 2 में चलने वाले कथनों पर विभिन्न तालिका संकेत का प्रभाव:

           (UPDLOCK)       (HOLDLOCK)    (UPDLOCK, HOLDLOCK)    (TABLOCKX)
---------------------------------------------------------------------------
SELECT    not blocked      not blocked       not blocked         blocked
INSERT    not blocked        blocked           blocked           blocked
UPDATE      blocked          blocked           blocked           blocked
DELETE      blocked          blocked           blocked           blocked

क्या मैंने उन प्रश्नों में दिए गए उत्तरों को गलत समझा, या मेरे परीक्षण में गलती की? यदि नहीं, तो आप अकेले (UPDLOCK, HOLDLOCK)बनाम का उपयोग क्यों करेंगे (HOLDLOCK)?


मैं जो पूरा करने की कोशिश कर रहा हूं उसका और स्पष्टीकरण:

मैं एक तालिका से पंक्तियों का चयन करना चाहूंगा और उस तालिका में डेटा को संशोधित होने से रोक सकता हूं, जबकि मैं इसे संसाधित कर रहा हूं। मैं उस डेटा को संशोधित नहीं कर रहा हूं, और रीड्स को होने देना चाहता हूं।

यह उत्तर स्पष्ट रूप से कहता है कि (UPDLOCK, HOLDLOCK)ब्लॉक को पढ़ेगा (जो मुझे चाहिए)। इस जवाब पर टिप्पणी का मतलब है कि यह है HOLDLOCKकि पढ़ता रोकता है। तालिका के संकेतों के प्रभावों को समझने और बेहतर तरीके से समझने और देखने के UPDLOCKलिए कि क्या अकेले में वही होगा जो मैं चाहता था, मैंने उपरोक्त प्रयोग किया और उन उत्तरों के विपरीत परिणाम प्राप्त किए।

वर्तमान में, मुझे विश्वास (HOLDLOCK)है कि मुझे क्या उपयोग करना चाहिए, लेकिन मुझे इस बात की चिंता है कि मुझसे कोई गलती हो सकती है या किसी ऐसी चीज की अनदेखी हो सकती है जो भविष्य में मुझे काटने आएगी, इसलिए यह प्रश्न है।

जवाबों:


102

UPDLOCK ब्लॉक का चयन क्यों करेगा? लॉक संगतता मैट्रिक्स स्पष्ट रूप से पता चलता है Nएस / यू और यू / एस विवाद, के रूप में के लिए कोई संघर्ष

के रूप में HOLDLOCK संकेत के अनुसार प्रलेखन राज्यों:

HOLDLOCK: SERIALIZABLE के बराबर है। अधिक जानकारी के लिए, इस विषय में बाद में SERIALIZABLE देखें।

...

परिवर्तनीय: ... स्कैन को एक ही शब्दार्थ के साथ किया जाता है, जो कि SERIALIZABLE अलगाव स्तर पर चल रहे लेनदेन के रूप में ...

और लेन-देन अलगाव स्तर विषय बताता है कि SERIALIZABLE का क्या अर्थ है:

कोई अन्य लेन-देन उस डेटा को संशोधित नहीं कर सकता है जिसे वर्तमान लेनदेन द्वारा पढ़ा गया है जब तक कि वर्तमान लेनदेन पूरा नहीं हो जाता।

अन्य लेनदेन मुख्य मूल्यों के साथ नई पंक्तियाँ नहीं डाल सकते हैं जो वर्तमान लेनदेन में किसी भी बयान द्वारा पढ़ी गई कुंजियों की श्रेणी में आते हैं जब तक कि वर्तमान लेनदेन पूरा नहीं हो जाता।

इसलिए आपके द्वारा देखे गए व्यवहार को उत्पाद प्रलेखन द्वारा पूरी तरह से समझाया गया है:

  • UPDLOCK समवर्ती चयन और न ही INSERT को ब्लॉक नहीं करता है, लेकिन किसी भी UPDATE या पंक्तियों के DELETE को B1 द्वारा ब्लॉक करता है
  • HOLDLOCK का अर्थ है SERALIZABLE और इसलिए SELECTS की अनुमति देता है, लेकिन T1 द्वारा चुनी गई पंक्तियों के UPDATE और DELETES को ब्लॉक करता है , साथ ही T1 द्वारा चयनित सीमा में कोई भी INSERT (जो कि पूरी तालिका है, इसलिए कोई भी सम्मिलित करता है)।
  • (UPDLOCK, HOLDLOCK): आपका प्रयोग यह नहीं दिखाता है कि उपरोक्त मामले के अलावा ब्लॉक क्या होगा, अर्थात् T2 में UPDLOCK के साथ एक और लेनदेन :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX स्पष्टीकरण के लिए कोई ज़रूरत नहीं है

असली सवाल यह है कि आप क्या हासिल करना चाहते हैं? ताला संकेत के साथ खेल w / ओ एक पूर्ण पूर्ण 110% लॉकिंग शब्दार्थ की समझ में परेशानी के लिए भीख माँग रहा है ...

ओपी एडिट के बाद:

मैं एक तालिका से पंक्तियों का चयन करना चाहूंगा और उस तालिका में डेटा को संशोधित होने से रोक सकता हूं, जबकि मैं इसे संसाधित कर रहा हूं।

आपको उच्च लेनदेन अलगाव स्तरों में से एक का उपयोग करना चाहिए। दोहराए गए रीड आपके द्वारा पढ़े गए डेटा को संशोधित होने से रोकेंगे। SERIALIZABLE आपके द्वारा पढ़े गए डेटा को संशोधित होने से और नए डेटा को सम्मिलित होने से रोकेगा । लेन-देन अलगाव स्तरों का उपयोग करना सही दृष्टिकोण है, जैसा कि क्वेरी संकेत का उपयोग करने के विपरीत है। केंद्र लिटिल में एक अच्छा पोस्टर है जो अलगाव स्तरों को बढ़ाता है


+1, और विस्तृत प्रतिक्रिया के लिए धन्यवाद। मैं अपने प्रश्न को अपडेट करूंगा कि मेरा लक्ष्य क्या है।
जेफ ओगाटा

1
@Remus Rusanu क्या आप इस बात के बारे में विस्तार से बता सकते हैं कि क्यों सही दृष्टिकोण अलगाव के स्तर का उपयोग क्वेरी संकेत का उपयोग करने के विपरीत है? मेरे पास एक ऐसी प्रक्रिया है जहां मुझे केवल दो तालिकाओं को संशोधित करने से रोकने की आवश्यकता है और मैं TABLOCK, HOLDLOCK का उपयोग कर रहा हूं, क्या मुझे वास्तव में अलगाव स्तर में बदलना चाहिए और अपने लेनदेन में सभी तालिकाओं को लॉक करना चाहिए?
स्टीव

मैं TABLOCKX के लिए स्पष्टीकरण पसंद कर सकता हूं :)
niico

ध्यान दें: केंद्र लिटिल के लिए ब्लॉग प्रविष्टि के लिए लिंक एक 404 देता है। मुझे कोई प्रविष्टि दिनांक 2 फरवरी, 2011 नहीं मिल सकती है, जैसा कि लिंक से पता चलता है।
बेकन बिट्स

22

UPDLOCK का उपयोग तब किया जाता है जब आप भविष्य के अपडेट स्टेटमेंट के लिए एक स्टेटमेंट के दौरान किसी पंक्ति या पंक्तियों को लॉक करना चाहते हैं। भविष्य का अद्यतन लेन-देन में अगला कथन हो सकता है।

अन्य सत्र अभी भी डेटा देख सकते हैं। वे केवल उन ताले को प्राप्त नहीं कर सकते हैं जो UPDLOCK और / या HOLDLOCK के साथ असंगत हैं।

आप UPDLOCK का उपयोग करते हैं जब आप अन्य सत्रों को बंद करने की पंक्तियों को बदलने से रोकते हैं। यह बंद पंक्तियों को अपडेट करने या हटाने की उनकी क्षमता को प्रतिबंधित करता है।

जब आप किसी भी डेटा को देख रहे हों, तो अन्य सत्रों को बदलते रहने के लिए आप होल्डलॉक का उपयोग करते हैं। यह आपके द्वारा लॉक की गई पंक्तियों को सम्मिलित करने, अपडेट करने या हटाने की उनकी क्षमता को प्रतिबंधित करता है। यह आपको क्वेरी को फिर से चलाने और समान परिणाम देखने की अनुमति देता है।


1
धन्यवाद, लेकिन मुझे नहीं लगता कि आपने वास्तव में मेरे प्रश्न का उत्तर दिया है: क्या उन प्रश्नों के उत्तर गलत थे जो बताते हैं कि (UPDLOCK,HOLDLOCK)ब्लॉक पढ़ता है, और क्या (UPDLOCK,HOLDLOCK)इसके बजाय सिर्फ उपयोग करने का एक कारण है (HOLDLOCK)?
जेफ ओगाटा

मेरा दूसरा कथन आपके प्रश्न का उत्तर देता है, वे गलत हैं। अन्य सत्र अभी भी डेटा पढ़ सकते हैं।
स्कॉट ब्रंस

अपडेटलॉक, होल्डलॉक होल्डलॉक के समान नहीं है। अपडेटलॉक, होल्डलॉक अपडेट के लिए पंक्तियों को लॉक करता है और आपके लेनदेन को क्रमबद्ध करता है। अपने आप से होल्डलॉक केवल आपके लेनदेन को क्रमबद्ध करता है। यह आगे की पहुंच के लिए चयनित पंक्तियों को लॉक नहीं करता है।
स्कॉट ब्रंस

"UPDLOCK का उपयोग तब किया जाता है जब आप भविष्य के अपडेट स्टेटमेंट के लिए एक चयन स्टेटमेंट के दौरान किसी पंक्ति या पंक्तियों को लॉक करना चाहते हैं।" मैं इस प्यार करता हूँ, XLOCK कुछ समय काम नहीं कर सकता है, क्योंकि हो
यीपिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.