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

SQL सर्वर में ताले का उपयोग करके लेनदेन संगामिति प्रबंधित करें

एक बहु-उपयोगकर्ता वातावरण में, यह आवश्यक है कि कटाव संगामिति को बनाए रखा जाए। ये ताले आकार में 96 बाइट्स की इन-मेमोरी संरचनाएं हैं। उनकी भूमिका प्रत्येक लेनदेन के लिए डेटा अखंडता, स्थिरता, समवर्ती नियंत्रण बनाए रखना है। SQL सर्वर प्रत्येक लेनदेन के लिए ACID परीक्षण का अनुसरण करता है।

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

ACID गुण सुनिश्चित करने के लिए, SQL सर्वर ऑब्जेक्ट्स पर विभिन्न प्रकार के लॉक लगाता है। इस मामले में, अन्य लेन-देन को लॉक जारी होने तक प्रतीक्षा करने की आवश्यकता है।

लॉकिंग मोड

SQL सर्वर प्रत्येक लेनदेन के लिए निम्नलिखित लॉकिंग मोड का उपयोग करता है।

  • साझा ताले:
    • इस लॉक में, SQL सर्वर अन्य सत्रों को डेटा पढ़ने के लिए चयनित संचालन करने में सक्षम बनाता है। हालांकि, यह लॉक के सक्रिय होने तक अपडेट को रोकता है।
    • एक से अधिक लेन-देन एक ही समय में एक पंक्ति या पृष्ठ पर साझा लॉक लगा सकते हैं।
    • यह एक सामान्य लॉक है जिसे आप अपने डेटाबेस ऑब्जेक्ट पर देखते हैं।

निम्नलिखित टी-एसक्यूएल में, हम एक विशिष्ट ग्राहक आईडी के लिए ग्राहक रिकॉर्ड पुनर्प्राप्त करते हैं। इसके अलावा, हम मौजूदा तालों की जांच के लिए गतिशील प्रबंधन दृश्य sys.dm_tran_locks का उपयोग करते हैं।

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

जैसा कि नीचे दिखाया गया है, इसमें दिए गए संसाधन आईडी (8194443284ए0) पर एक साझा लॉक है:

  • अनन्य (एक्स) ताले:
    • एसक्यूएल सर्वर डीएमएल संचालन (डिलीट, इंसर्ट या अपडेट) के लिए एक्सक्लूसिव लॉक (एक्स) का उपयोग करता है, जिसमें एक पंक्ति या पेज डेटा को संशोधित करने की आवश्यकता होती है।
    • यह अन्य उपयोगों को संसाधन तक पहुंचने से रोकता है जब तक कि ताला नहीं लगाया जाता।
    • SQL सर्वर में लेन-देन के लिए किसी पृष्ठ या पंक्ति पर केवल एक अनन्य लॉक हो सकता है।

इस उदाहरण में, हम ग्राहक आईडी 1 के लिए रिकॉर्ड अपडेट करना चाहते हैं। इसलिए, SQL सर्वर को संसाधन पर एक विशेष लॉक की आवश्यकता होती है। लेन-देन पूरा होने तक कोई अन्य लेन-देन इस संसाधन पर अनन्य लॉक प्राप्त नहीं कर सकता है।

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • अपडेट (यू) लॉक:
    • अपडेट लॉक एक विशेष लॉक के समान है। इसे एक साझा लॉक वाले रिकॉर्ड पर रखा जा सकता है।
    • अपडेट लॉक एक और साझा लॉक को एक विशिष्ट पंक्ति पर रखता है। एक बार जब यह रिकॉर्ड को संशोधित कर सकता है, तो SQL सर्वर अपडेट लॉक को एक विशेष लॉक में बदल देता है।
    • SQL सर्वर अपडेट लॉक वाले संसाधन पर साझा लॉक नहीं लगा सकता।
    • अपडेट लॉक करने के लिए आप WITH UPDLOCK का भी उपयोग कर सकते हैं।

निम्न उदाहरण संसाधन आईडी (8194443284a0) पर एक अद्यतन लॉक दिखाता है:

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • इरादे ताले:
    • इसका उद्देश्य किसी लेन-देन को लॉक प्राप्त करने के अपने इरादे के बारे में सूचित करना है। यह तब होता है जब किसी लेन-देन को पदानुक्रम में निचले संसाधनों पर साझा या अनन्य लॉक की आवश्यकता होती है।
    • लेन-देन अन्य लेनदेन को इंटेंट लॉक का उपयोग करके टेबल पर एक विशेष लॉक प्राप्त करने की अनुमति नहीं देता है।
    • इंटेंट लॉक के प्रकार नीचे हैं।
      • इंटेंट शेयर्ड (IS) लॉक:यह उन निचले पदानुक्रम संसाधनों पर व्यक्तिगत रूप से साझा लॉक प्राप्त करके निम्न पदानुक्रम संसाधनों को पढ़ने के लिए SQL सर्वर के इरादे को इंगित करता है।
      • इंटेंट एक्सक्लूसिव (IX) लॉक:यह उन निचले पदानुक्रम संसाधनों पर एक विशेष लॉक प्राप्त करके निम्न पदानुक्रम संसाधनों को संशोधित करने के लिए SQL सर्वर के इरादे को इंगित करता है।
      • एक इंटेंट अपडेट लॉक (IU):इसे केवल निचले पदानुक्रमित संसाधनों के लिए पृष्ठ स्तर पर प्राप्त किया जा सकता है, और एक बार अपडेट पूरा होने के बाद, यह IX लॉक में परिवर्तित हो जाता है।

जैसा कि नीचे दिखाया गया है, लेन-देन में एक कुंजी पर एक विशेष लॉक होता है, और इसमें पृष्ठ स्तर पर एक इंटेंट अनन्य लॉक होता है।

रूपांतरण लॉक

SQL सर्वर लेन-देन में कई प्रश्नों का समर्थन करने के लिए लॉक प्रकारों को परिवर्तित करता है। इन तालों को रूपांतरण ताले के रूप में जाना जाता है।

  • SIX - इंटेंट एक्सक्लूसिव लॉक के साथ शेयर किया गया:SQL सर्वर ट्रांजैक्शन में कई पेजों पर एक शेयर्ड लॉक होता है और इसमें एक अनन्य होता है। कई पंक्तियों पर लॉक करें।
  • SIU - SQL सर्वर लेनदेन में कई पृष्ठों पर एक साझा लॉक होता है और इसमें अपडेट होता है कई पंक्तियों पर लॉक करें।
  • UIX- इंटेंट एक्सक्लूसिव लॉक के साथ अपडेट:SQL सर्वर ट्रांजैक्शन में कई पेज पर अपडेट लॉक होता है और इसमें एक्सक्लूसिव होता है। कई पंक्तियों पर लॉक करें।

स्कीमा लॉक

SQL सर्वर दो प्रकार के स्कीमा लॉक प्राप्त करता है।

  • स्कीमा स्टेबिलिटी लॉक (Sch-S):इस लॉक का उपयोग तब किया जाता है जब स्कीमा के आधार पर क्वेरी को संकलित किया जाता है, और इसकी निष्पादन योजना तैयार की जा रही है। Sch-S लॉक ऑब्जेक्ट डेटा तक किसी भी एक्सेस को ब्लॉक नहीं करता है।
  • स्कीमा संशोधन लॉक (एसएच-एम):यह लॉक डीडीएल (डेटा डेफिनिशन लैंग्वेज) क्वेरी निष्पादन से उत्पन्न होता है। SQL सर्वर में किसी ऑब्जेक्ट पर केवल एक स्कीमा संशोधन लॉक हो सकता है। आप इस स्कीमा लॉक के साथ किसी ऑब्जेक्ट को संशोधित नहीं कर सकते।

नीचे दिए गए उदाहरण में, ऑब्जेक्ट परिभाषा को संशोधित करते समय हमें Sch-S और Sch-M दोनों लॉक मिलते हैं।

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

लॉक संगतता

एक ही संसाधन में एक साथ कई लेन-देन के मामले में अनुमत ताले की जाँच करने के लिए लॉक संगतता सहायक होती है। यदि कोई लेन-देन ताला लगाता है, तो दूसरे लेन-देन द्वारा रखा गया नया ताला उसके साथ संगत होना चाहिए। इसलिए, आप निम्न लॉक संगतता सूची के माध्यम से जा सकते हैं और एकाधिक लेनदेन के दौरान समर्थित लॉक ढूंढ सकते हैं।

लॉक एस्केलेशन

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

यह लॉक एस्केलेशन के लिए निम्न दहलीज का उपयोग करता है।

  • स्मृति सीमा: लॉक मेमोरी थ्रेशोल्ड लॉक मेमोरी के 40 प्रतिशत पर सेट है।
  • लॉक थ्रेशोल्ड: यदि वर्तमान तालिका या सूचकांक पर प्राप्त तालों की संख्या 5000 से अधिक है, तो ताला वृद्धि को ट्रिगर किया जा सकता है।

उपयोगकर्ता परिवर्तन तालिका विवरण का उपयोग करके लॉक एस्केलेशन को नियंत्रित कर सकते हैं। आप DISABLE पैरामीटर मान का उपयोग करके उस तालिका के लिए लॉक एस्केलेशन को पूरी तरह से अक्षम कर सकते हैं।

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

आप Microsoft दस्तावेज़ का संदर्भ ले सकते हैं लॉक एस्केलेशन को विस्तार से समझने के लिए।

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

निष्कर्ष

यह आलेख लॉक और इसकी वृद्धि प्रक्रिया की निगरानी के लिए SQL सर्वर लॉक और DMV का विस्तृत अवलोकन देता है। 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. डेटाबेस मेल (SSMS) के लिए एक डिफ़ॉल्ट सार्वजनिक प्रोफ़ाइल सेट करें

  2. SQL सर्वर में DROP टेबल स्टेटमेंट को समझना

  3. WHERE क्लॉज में कॉलम एलियास का जिक्र करते हुए

  4. क्या IS NULL और =NULL . में कोई अंतर है?

  5. SQL सर्वर में एक साथ कई कॉलम कैसे बदलें