Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में NOLOCK संकेत की अनिवार्यता और उपयोग

SQL सर्वर लॉकिंग तंत्र का मुख्य विचार यह है कि यह लेनदेन की स्थिरता को नियंत्रित करता है। इस सिद्धांत के अनुसार, यदि कोई प्रक्रिया इन्सर्ट, डिलीट या अपडेट ऑपरेशन करना चाहती है, तो SQL सर्वर इंजन पंक्ति या पंक्तियों को लॉक कर देता है और लेन-देन पूरा होने तक दूसरी प्रक्रिया की अनुमति नहीं देता है। कुछ परिस्थितियों में, यह लॉकिंग तंत्र उच्च समवर्ती प्रक्रिया दबाव जैसी प्रदर्शन समस्याओं को जन्म दे सकता है। तो आप अपने डेटाबेस में गतिरोध का अनुभव कर सकते हैं (डेडलॉक एक समवर्ती समस्या है जिसमें दो लेनदेन एक ही डेटा को एक साथ एक्सेस करना चाहते हैं)। इस लेख में, हम इस बात पर ध्यान देंगे कि NOLOCK हिंट की मदद से लॉक की समस्या से कैसे बचा जाए। सबसे पहले, आइए गंदी पठन पद्धति की मुख्य अनिवार्यताओं और विवरणों को जानें क्योंकि NOLOCK संकेत गंदे पढ़ने का कारण बन सकता है।

डर्टी रीड: इस पठन पद्धति में, पठन प्रक्रिया अप्रतिबद्ध डेटा को पढ़ती है और पढ़ने की प्रक्रिया खुले लेनदेन की परवाह नहीं करती है, इसलिए ताले पढ़ने की प्रक्रिया में कोई समस्या नहीं पैदा करते हैं। नतीजतन, इस प्रकार की रीडिंग लॉकिंग की समस्याओं को कम करती है। हालाँकि, गंदी पठन पद्धति के फायदे और नुकसान हैं क्योंकि गंदे पठन से सेलेक्ट स्टेटमेंट के परिणाम सेट में असंगति की समस्या हो सकती है। जैसा कि पहले ही उल्लेख किया गया है, इस परिणाम सेट में अप्रतिबंधित लेनदेन डेटा शामिल हो सकता है, इसलिए हमें इस तरह के पढ़ने का निर्णय लेते समय गंदे पढ़ने पर विचार करना होगा। हम गंदी रीडिंग के दौरान बनाई गई पंक्तियों की सटीकता के बारे में सुनिश्चित नहीं हो सकते क्योंकि इन पंक्तियों को वापस रोल किया जा सकता है। दूसरी ओर, इस प्रकार की रीडिंग हमें लॉकिंग समस्याओं से बचने और SQL सर्वर के प्रदर्शन को बढ़ाने की अनुमति देती है।

नोलॉक: SQL सर्वर डिफॉल्ट आइसोलेशन लेवल रीड कमिटेड है और इस आइसोलेशन लेवल में SQL सर्वर लॉक किए गए ऑब्जेक्ट्स को पढ़ने की अनुमति नहीं देता है जो कि अनकमिटेड ट्रांजेक्शन द्वारा लॉक होते हैं। इसके अलावा, इन लॉक किए गए ऑब्जेक्ट्स को लॉक एस्केलेशन के अनुसार बदला जा सकता है।

नोट:SQL सर्वर लॉकिंग आलेख की इस मुख्य अवधारणा में आप लॉकिंग और लॉक एस्केलेशन के बारे में विवरण प्राप्त कर सकते हैं।

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

इस स्थिति में, user2 कम से कम 10 सेकंड तक प्रतीक्षा करता है और फिर उपयोगकर्ता 1 द्वारा लेनदेन वापस ले लिया जाएगा, और फिर उपयोगकर्ता 2 हरी पंक्ति को पढ़ सकता है क्योंकि लॉक की गई पंक्ति उपयोगकर्ता 1 द्वारा जारी की जाएगी। यह SQL सर्वर रीड कमिटेड आइसोलेशन स्तर का डिफ़ॉल्ट व्यवहार है।

अब, हम इस मामले को SQL सर्वर में प्रदर्शित करेंगे। सबसे पहले, हम FruitSales तालिका और उसकी पंक्तियाँ बनाएंगे।

टेबल फ्रूटसेल्स बनाएं (आईडी INT पहचान (1,1) प्राथमिक कुंजी, [नाम] वर्कर (20), बिक्री कुल फ्लोट) फलों के बिक्री मूल्यों ('ऐप्पल', 10), ('ऑरेंज', 8) में प्रवेश करें, ( 'केला',2)

इस चरण में, हम दो SQL सर्वर प्रबंधन स्टूडियो क्वेरी विंडो खोलेंगे और user1 क्वेरी निष्पादित करेंगे और फिर user2 क्वेरी निष्पादित करेंगे।

 ---USER1 ---- BEGIN TRAN UPDATE FruitSales SET SalesTotal =20 जहां Id=2 विलंब के लिए '00:00:10' रोलबैक ट्रांजेक्शन ---USER2---सेट आँकड़ों का चयन करें * फलों की बिक्री से जहां आईडी=2

जैसा कि आप ऊपर की छवि में देख सकते हैं, दूसरी क्वेरी उपयोगकर्ता 1 लेनदेन के रोलबैक तक प्रतीक्षा करती है।

अब, हम NOLOCK संकेत और उपयोग के विवरण पर चर्चा करेंगे। NOLOCK संकेत सबसे लोकप्रिय तालिका संकेत है जिसका उपयोग डेटाबेस डेवलपर्स और व्यवस्थापकों द्वारा SQL सर्वर डेटाबेस में लॉक समस्याओं को समाप्त करने के लिए किया जाता है। NOLOCK टेबल हिंट की मदद से हम लॉक किए गए ऑब्जेक्ट्स (पंक्ति, पेज या टेबल) को पढ़ सकते हैं, जो खुले लेनदेन से लॉक होते हैं। NOLOCK संकेत SQL सर्वर क्वेरी ऑप्टिमाइज़र के डिफ़ॉल्ट व्यवहार को ओवरराइड करता है ताकि चयन कथन लॉक की गई वस्तुओं को पढ़ सके।

अब, हम user2 सेलेक्ट स्टेटमेंट में NOLOCK संकेत जोड़ेंगे और फिर user1 अपडेट शुरू करेंगे और फिर user2 सेलेक्ट स्टेटमेंट को निष्पादित करेंगे।

---USER1 ---- BEGIN TRAN UPDATE FruitSales SET SalesTotal =20 जहां Id=2 विलंब के लिए '00:00:10' रोलबैक ट्रांजेक्शन ---USER2 ---- सेट आँकड़ों का समय चयन करें * फलों की बिक्री से (NOLOCK) जहां Id=2

इस चरण में, हम बताएंगे कि उपयोगकर्ता 2 चयन कथन पर NOLOCK संकेत को कैसे प्रभावित किया जाए। उपयोगकर्ता 1 एक स्पष्ट लेनदेन में अद्यतन विवरण निष्पादित करता है और फिर उपयोगकर्ता 2 चयन कथन निष्पादित करता है और परिणाम सेट लेनदेन पूरा होने में देरी के बिना वापस आ जाता है। यह NOLOCK का मुख्य विचार है, यह बंद वस्तुओं को पढ़ता है।

अब, हम सेलेक्ट स्टेटमेंट के परिणाम सेट पर ध्यान केंद्रित करेंगे। User2 चयन कथन ने SalesTotal मान 20 प्राप्त किया लेकिन SalesTotal का वास्तविक मान अभी भी 8 है। ध्यान रखें कि यदि आप अपने चयन कथन में NOLOCK तालिका संकेत का उपयोग कर रहे हैं तो आपको इस प्रकार के गलत डेटा परिणामों का सामना करना पड़ सकता है।

युक्ति: "साथ" कीवर्ड एक पदावनत विशेषता है, इसलिए Microsoft अनुशंसा करता है कि आप इसे अपने नए डेटाबेस विकास में उपयोग न करें और अपने वर्तमान विकास में "साथ" कीवर्ड को हटा दें। आप NOLOCK संकेत के उपयोग को “with” कीवर्ड के बिना पा सकते हैं।

---USER1 ---- BEGIN TRAN UPDATE FruitSales SET SalesTotal =20 जहां Id=2 विलंब के लिए प्रतीक्षा करें '00:00:10' रोलबैक ट्रांजेक्शन चुनें * फलों की बिक्री से जहां Id=2 --USER2--चयन * से फलों की बिक्री (NOLOCK) जहां Id=2

इसके अलावा, READUNCOMMITTED तालिका संकेत NOLOCK संकेत के बराबर है और हम NOLOCK संकेत के बजाय READUNCOMMITTED संकेत का उपयोग कर सकते हैं।

फलों की बिक्री से * चुनें (पढ़ें) जहां Id=2

फिर भी, NOLOCK संकेत के बारे में एक विशेष मामला है जो लॉकिंग बैरियर को पार नहीं कर सकता है। यदि किसी तालिका को बदलने की कोई प्रक्रिया है, तो NOLOCK संकेत इस प्रकार के लॉक को दूर नहीं कर सकता है और रीडिंग ऑपरेशन को जारी नहीं रख सकता है। इस समस्या का कारण यह है कि NOLOCK संकेत Sch-S (स्कीमा स्थिरता) लॉक प्राप्त करता है और ALTER TABLE कथन SCH-M (स्कीमा संशोधन) लॉक प्राप्त करता है, इसलिए एक विरोध उत्पन्न होता है।

सबसे पहले, हम निम्नलिखित क्वेरी की सहायता से FruitSales तालिका के Object_Id को जानेंगे।

OBJECT_ID('FruitSales') चुनें

निम्न user1 क्वेरी चलाएँ और फिर user2 क्वेरी चलाएँ। परिणामस्वरूप, user2 क्वेरी user1 तालिका परिवर्तन प्रक्रिया को पूरा करने में देरी करेगी।

--USER1---BEGIN TRANALTER TABLE FruitsaleAdd ColorofFruit Varchar(200) DELAY '00:00:35GOCOMMIT TRAN --USER2--Select * From FruitSales (NOLOCK) जहां Id=2

नई क्वेरी विंडो खोलें और निम्न क्वेरी निष्पादित करें। यह क्वेरी उपयोगकर्ता1 और उपयोगकर्ता2 क्वेरी के लॉक प्रकार का पता लगाने में मदद करेगी।

सेलेक्ट रिसोर्स_टाइप, रिसोर्स_डेटाबेस_आईडी, रिसोर्स_डिस्क्रिप्शन, रिसोर्स_एसोसिएटेड_एंटिटी_आईडी, रिसोर्स_लॉक_पार्टिशन, रिक्वेस्ट_मोड, रिक्वेस्ट_टाइप, Request_status, Request_session_id, Request_request_id, Request_owner_type, Request_owner_id, Lock_owner_address55
 

अब, हम SCH-M और SCH-S इंटरैक्शन के लिए लॉक कम्पैटिबिलिटी मैट्रिक्स की जांच करेंगे। मैट्रिक्स बताता है कि SCH-M और SCH-S इंटरेक्शन एक विरोध का कारण बनता है।

निष्कर्ष

इस लेख में, हमने गंदी पढ़ने की प्रक्रिया और NOLOCK संकेत का उल्लेख किया है। लॉक किए गए पृष्ठ को पढ़ने के लिए NOLOCK संकेत का उपयोग करना एक प्रभावी तरीका है, लेकिन इसके कुछ फायदे और नुकसान भी हैं। इस कारण से, आपको इसका उपयोग करने से पहले NOLOCK संकेत पर विचार करना होगा।

संदर्भ

SQL सर्वर ट्रांजेक्शन लॉकिंग और रो वर्जनिंग गाइड

संकेत (ट्रांजैक्ट-एसक्यूएल) - टेबल

ट्रांजेक्शन आइसोलेशन लेवल (ट्रांजैक्ट-एसक्यूएल) सेट करें


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सी # में SQL सर्वर डेटाबेस से डेटा कैसे पुनर्प्राप्त करें?

  2. SQL सर्वर 2008 खाली स्ट्रिंग बनाम स्पेस

  3. SQL सर्वर चुनें जहां किसी भी कॉलम में 'x' होता है

  4. SQL सर्वर:तालिका में पंक्तियों की अधिकतम संख्या

  5. प्रोग्रामेटिक रूप से SQL सर्वर कनेक्शन का परीक्षण करने का सबसे अच्छा तरीका क्या है?