इसका एक बड़ा प्रभाव है।
अद्यतन लॉक पंक्ति पर एक अद्यतन ताला, पृष्ठ पर इरादा अद्यतन और तालिका/डेटाबेस पर साझा लॉक लेता है।
यह तालिका के भीतर डेटा तक पहुंचने से अन्य प्रश्नों को रोकता नहीं है, क्योंकि पेज/डेटाबेस पर ताले पूरी तरह से ताले साझा करते हैं। वे ताले के विपरीत होने वाले ऑपरेशन करने का प्रयास करके व्यक्तिगत पंक्ति/पृष्ठ/तालिका के खिलाफ ताले को तोड़ नहीं सकते हैं। अगर ऐसा हुआ तो अनुरोध वर्तमान ताले के पीछे कतार होगा और आगे बढ़ने से पहले उपलब्ध होने की प्रतीक्षा करेगा।
होल्डॉक का उपयोग करके, क्वेरी को क्रमबद्ध करने के लिए मजबूर किया जा रहा है, जब तक कि कार्रवाई पूरी नहीं हो जाती तब तक तालिका को लॉक कर दें। यह किसी को भी टेबल पढ़ने से रोकता है जब तक कि नोलॉक संकेत का उपयोग नहीं किया जाता है, जिससे संभावित गंदे पढ़ने की अनुमति मिलती है।
प्रभाव देखने के लिए, उदाहरण तालिका 'foo' उत्पन्न करें और इसमें कुछ ट्रैश डेटा डालें।
begin tran
select * from foo with (updlock)
where tableid = 1
-- notice there is no commit tran
खुला एक और खिड़की और कोशिश:
select * from foo
पंक्तियों वापस आना, अब मूल प्रश्न लेन-देन के लिए प्रतिबद्ध। पुन: चलाने यह बदल holdlock रूप में अच्छी तरह उपयोग करने के लिए:
begin tran
select * from foo with (updlock, holdlock)
where tableid = 1
अन्य विंडो पर वापस जाएं और फिर से डेटा का चयन करने की कोशिश, क्वेरी मान नहीं करेगा क्योंकि इसमें विशेष ताला द्वारा अवरुद्ध है। पहली विंडो पर लेनदेन को कम करें और दूसरी क्वेरी के परिणाम दिखाई देंगे क्योंकि यह अब अवरुद्ध नहीं है।
अंतिम परीक्षण नोलॉक का उपयोग करना है, लेन-देन को फिर से अपडेटॉक और होल्डॉक का उपयोग करना है। तब चलाने दूसरी विंडो में निम्न:
select * from foo (nolock)
परिणामों को वापस स्वचालित रूप से आ जाएगा, जब से तुम एक गंदा पढ़ने (अप्रतिबद्ध पढ़ें) के जोखिम को स्वीकार कर लिया है।
तो यह एक बड़ा प्रभाव देखा जाता है, जिसमें आप उस तालिका के खिलाफ क्रियाओं को क्रमबद्ध करने के लिए मजबूर कर रहे हैं जो आप चाहते हैं (अद्यतन होने के आधार पर) या उस तालिका पर एक बहुत बड़ी बाधा उत्पन्न करेगा । यदि हर किसी ने लंबे समय तक चलने वाले लेन-देन के साथ व्यस्त टेबल पर ऐसा किया तो यह किसी एप्लिकेशन के भीतर महत्वपूर्ण देरी का कारण बन जाएगा।
सभी एसक्यूएल सुविधाओं के साथ, जब सही ढंग से उपयोग किया जाता है तो वे शक्तिशाली हो सकते हैं, लेकिन फीचर/संकेत का गलत उपयोग महत्वपूर्ण समस्याएं पैदा कर सकता है। जब मैं इंजन को ओवरराइड करना चाहता हूं - एक डिफ़ॉल्ट दृष्टिकोण के रूप में नहीं, तो मैं आखिरी उपाय के रूप में संकेतों का उपयोग करना पसंद करता हूं।
अनुरोध के रूप में संपादित करें: SQL 2005, 2008, 2008R2 (सभी एंटरप्राइज़) में परीक्षण किया गया - सभी बहुत अधिक डिफ़ॉल्ट सेटिंग्स पर स्थापित, सभी डिफ़ॉल्ट का उपयोग करके बनाए गए डेटाबेस का परीक्षण करें (केवल डीबी का नाम दर्ज करें)।
अच्छा उत्तर, धन्यवाद – marijne
अच्छा स्पष्टीकरण, जो बहुत मदद करता है! – Mercurybullet
@ डैरेन - मैंने आपके द्वारा किए गए संपादन को वापस ले लिया है, कोई लॉक डिफ़ॉल्ट नहीं है और दूसरा चयन अपडेट लॉक नहीं लेना चाहिए। – Andrew