इस पोस्ट में, हम SQL सर्वर लॉक मैकेनिज्म और SQL सर्वर मानक डायनेमिक मैनेजमेंट व्यू के साथ SQL सर्वर लॉकिंग की निगरानी कैसे करें, इस पर चर्चा करेंगे। इससे पहले कि हम SQL सर्वर लॉक आर्किटेक्चर की व्याख्या करना शुरू करें, आइए यह वर्णन करने के लिए कुछ समय दें कि ACID (परमाणु, संगति, अलगाव और स्थायित्व) डेटाबेस क्या है। ACID डेटाबेस को डेटाबेस सिद्धांत के रूप में समझाया जा सकता है। यदि किसी डेटाबेस को रिलेशनल डेटाबेस कहा जाता है, तो उसे परमाणुता, संगति, अलगाव और स्थायित्व आवश्यकताओं को पूरा करना होता है। अब, हम इन आवश्यकताओं को संक्षेप में समझाएंगे।
परमाणुता :यह अविभाज्यता के सिद्धांत को दर्शाता है जिसे हम लेनदेन प्रक्रिया की मुख्य विशेषता के रूप में वर्णित करते हैं। लेन-देन ब्लॉक को अप्राप्य नहीं छोड़ा जा सकता है। शेष लेन-देन ब्लॉक का आधा डेटा असंगति का कारण बनता है। या तो पूरा लेन-देन किया जाता है या लेन-देन शुरुआत में वापस आ जाता है। अर्थात्, लेन-देन द्वारा किए गए सभी परिवर्तन पूर्ववत हो जाते हैं और अपनी पिछली स्थिति में वापस आ जाते हैं।
संगति :एक नियम है जो गैर-विभाज्यता नियम के उप-संरचना को निर्धारित करता है। लेन-देन डेटा में एकरूपता होनी चाहिए। यही है, यदि लेनदेन में अद्यतन कार्रवाई की जाती है, तो या तो सभी शेष लेनदेन किए जाने चाहिए या अद्यतन कार्रवाई रद्द कर दी जानी चाहिए। यह डेटा एकरूपता की दृष्टि से बहुत महत्वपूर्ण है।
अलगाव :यह प्रत्येक लेनदेन डेटाबेस के लिए एक अनुरोध पैकेट है। अनुरोध पैकेट द्वारा किए गए परिवर्तन किसी अन्य लेनदेन के पूरा होने से पहले दिखाई देने चाहिए। प्रत्येक लेनदेन को अलग से संसाधित किया जाना चाहिए। सभी लेन-देन होने के बाद किसी अन्य लेन-देन के लिए दृश्यमान होना चाहिए।
स्थायित्व: लेनदेन डेटा के साथ जटिल संचालन कर सकते हैं। इन सभी लेनदेन को सुरक्षित करने के लिए, उन्हें लेनदेन त्रुटि के लिए प्रतिरोधी होना चाहिए। SQL सर्वर में उत्पन्न होने वाली सिस्टम समस्याओं को बिजली की विफलता, ऑपरेटिंग सिस्टम या अन्य सॉफ़्टवेयर-प्रेरित त्रुटियों के विरुद्ध तैयार और लचीला होना चाहिए।
लेन-देन: लेन-देन प्रक्रिया का सबसे छोटा स्टैक है जिसे छोटे टुकड़ों में विभाजित नहीं किया जा सकता है। इसके अलावा, लेन-देन प्रक्रिया के कुछ समूह क्रमिक रूप से निष्पादित किए जा सकते हैं, लेकिन जैसा कि हमने परमाणु सिद्धांत में समझाया है, यदि एक भी लेन-देन विफल हो जाता है, तो सभी लेनदेन ब्लॉक विफल हो जाएंगे।
लॉक: डेटा स्थिरता सुनिश्चित करने के लिए लॉक एक तंत्र है। लेन-देन शुरू होने पर SQL सर्वर ऑब्जेक्ट को लॉक कर देता है। जब लेन-देन पूरा हो जाता है, तो SQL सर्वर लॉक किए गए ऑब्जेक्ट को रिलीज़ करता है। इस लॉक मोड को SQL सर्वर प्रक्रिया प्रकार और आइसोलेशन स्तर के अनुसार बदला जा सकता है। ये लॉक मोड हैं:
लॉक पदानुक्रम: SQL सर्वर में एक लॉक पदानुक्रम होता है जो इस पदानुक्रम में लॉक ऑब्जेक्ट प्राप्त करता है। एक डेटाबेस पदानुक्रम के शीर्ष पर स्थित होता है और पंक्ति सबसे नीचे स्थित होती है। नीचे दी गई छवि SQL सर्वर के लॉक पदानुक्रम को दर्शाती है।
साझा (एस) लॉक: यह लॉक प्रकार तब होता है जब ऑब्जेक्ट को पढ़ने की आवश्यकता होती है। इस प्रकार के लॉक से अधिक समस्या नहीं होती है।
अनन्य (X) लॉक: जब यह लॉक प्रकार होता है, तो यह अन्य लेन-देन को लॉक किए गए ऑब्जेक्ट को संशोधित करने या एक्सेस करने से रोकने के लिए होता है।
अपडेट (यू) लॉक: यह लॉक प्रकार अनन्य लॉक के समान है लेकिन इसमें कुछ अंतर हैं। हम अपडेट ऑपरेशन को विभिन्न चरणों में विभाजित कर सकते हैं:चरण पढ़ें और चरण लिखें। पठन चरण के दौरान, SQL सर्वर नहीं चाहता कि अन्य लेन-देन को इस ऑब्जेक्ट तक पहुंच को बदला जाए। इस कारण से, SQL सर्वर अद्यतन लॉक का उपयोग करता है।
इरादा लॉक: इंटेंट लॉक तब होता है जब SQL सर्वर साझा (S) लॉक या अनन्य (X) लॉक को लॉक पदानुक्रम में कम संसाधनों में से कुछ पर प्राप्त करना चाहता है। व्यवहार में, जब SQL सर्वर किसी पृष्ठ या पंक्ति पर लॉक प्राप्त करता है, तो तालिका में इंटेंट लॉक की आवश्यकता होती है।
इन सभी संक्षिप्त व्याख्याओं के बाद, हम तालों की पहचान कैसे करें, इसका उत्तर खोजने का प्रयास करेंगे। SQL सर्वर मेट्रिक्स तक पहुँचने के लिए बहुत सारे गतिशील प्रबंधन दृश्य प्रस्तुत करता है। SQL सर्वर लॉक की पहचान करने के लिए, हम sys.dm_tran_locks . का उपयोग कर सकते हैं दृश्य। इस दृश्य में, हम वर्तमान में सक्रिय लॉक प्रबंधक संसाधनों के बारे में बहुत सारी जानकारी प्राप्त कर सकते हैं।
पहले उदाहरण में, हम एक डेमो टेबल बनाएंगे जिसमें कोई इंडेक्स शामिल नहीं होगा और इस डेमो टेबल को अपडेट करने का प्रयास करेंगे।
CREATE TABLE TestBlock (Id INT , Nm VARCHAR(100)) INSERT INTO TestBlock values(1,'CodingSight') In this step, we will create an open transaction and analyze the locked resources. BEGIN TRAN UPDATE TestBlock SET Nm='NewValue_CodingSight' where Id=1 select @@SPID
अब, हम sys.dm_tran_lock दृश्य की जांच करेंगे।
select * from sys.dm_tran_locks WHERE request_session_id=74
यह दृश्य सक्रिय लॉक संसाधनों के बारे में बहुत सारी जानकारी देता है। लेकिन इस दृष्टि से कुछ आंकड़ों को समझना संभव नहीं है। इस कारण से, हमें sys.dm_tran_locks . में शामिल होना होगा अन्य दृश्यों के लिए देखें।
SELECT dm_tran_locks.request_session_id, dm_tran_locks.resource_database_id, DB_NAME(dm_tran_locks.resource_database_id) AS dbname, CASE WHEN resource_type = 'OBJECT' THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id) ELSE OBJECT_NAME(partitions.OBJECT_ID) END AS ObjectName, partitions.index_id, indexes.name AS index_name, dm_tran_locks.resource_type, dm_tran_locks.resource_description, dm_tran_locks.resource_associated_entity_id, dm_tran_locks.request_mode, dm_tran_locks.request_status FROM sys.dm_tran_locks LEFT JOIN sys.partitions ON partitions.hobt_id = dm_tran_locks.resource_associated_entity_id LEFT JOIN sys.indexes ON indexes.OBJECT_ID = partitions.OBJECT_ID AND indexes.index_id = partitions.index_id WHERE resource_associated_entity_id > 0 AND resource_database_id = DB_ID() and request_session_id=74 ORDER BY request_session_id, resource_associated_entity_id
ऊपर की छवि में, आप बंद संसाधनों को देख सकते हैं। SQL सर्वर उस पंक्ति में अनन्य लॉक प्राप्त करता है। (RID :एक पंक्ति पहचानकर्ता एक हीप के भीतर एक पंक्ति को लॉक करने के लिए उपयोग किया जाता है) उसी समय, SQL सर्वर पृष्ठ में इंटेंट अनन्य लॉक और TestBlock प्राप्त करता है टेबल। इसका मतलब है कि कोई भी अन्य प्रक्रिया इस संसाधन को तब तक नहीं पढ़ सकती है जब तक कि SQL सर्वर लॉक जारी नहीं करता। यह SQL सर्वर में मूल लॉक तंत्र है।
अब, हम अपनी टेस्ट टेबल पर कुछ सिंथेटिक डेटा भरेंगे।
TRUNCATE TABLE TestBlock DECLARE @K AS INT=0 WHILE @K <8000 BEGIN INSERT TestBlock VALUES(@K, CAST(@K AS varchar(10)) + ' Value' ) SET @[email protected]+1 END After completing this step, we will run two queries and check the sys.dm_tran_locks view. BEGIN TRAN UPDATE TestBlock set Nm ='New_Value' where Id<5000
उपरोक्त क्वेरी में, SQL सर्वर प्रत्येक पंक्ति पर अनन्य लॉक प्राप्त करता है। अब, हम एक और क्वेरी चलाएंगे।
BEGIN TRAN UPDATE TestBlock set Nm ='New_Value' where Id<7000
उपरोक्त क्वेरी में, SQL सर्वर टेबल पर अनन्य लॉक बनाता है, क्योंकि SQL सर्वर इन पंक्तियों के लिए बहुत सारे RID लॉक प्राप्त करने का प्रयास करता है जिसे अपडेट किया जाएगा। यह मामला डेटाबेस इंजन में बहुत अधिक संसाधन खपत का कारण बनता है। इसलिए, SQL सर्वर स्वचालित रूप से इस अनन्य लॉक को एक अप-स्तरीय ऑब्जेक्ट में ले जाता है जो लॉक पदानुक्रम में है। हम इस तंत्र को लॉक एस्केलेशन के रूप में परिभाषित करते हैं। लॉक एस्केलेशन को टेबल लेवल पर बदला जा सकता है।
ALTER TABLE XX_TableName SET ( LOCK_ESCALATION = AUTO -- or TABLE or DISABLE ) GO
मैं लॉक एस्केलेशन के बारे में कुछ नोट्स जोड़ना चाहूंगा। यदि आपके पास विभाजित तालिका है, तो हम वृद्धि को विभाजन स्तर पर सेट कर सकते हैं।
इस चरण में, हम एक क्वेरी निष्पादित करेंगे जो एडवेंचरवर्क्स मानव संसाधन तालिका में लॉक बनाती है। इस तालिका में क्लस्टर्ड और गैर-क्लस्टर इंडेक्स हैं।
BEGIN TRAN UPDATE [HumanResources].[Department] SET Name='NewName' where DepartmentID=1
जैसा कि आप नीचे दिए गए परिणाम फलक में देख सकते हैं, हमारा लेन-देन PK_Department_DepartmentID क्लस्टर अनुक्रमणिका कुंजी में अनन्य ताले प्राप्त करता है और AK_Department_Name गैर-संकुल अनुक्रमणिका कुंजी में अनन्य ताले भी प्राप्त करता है। अब, हम यह प्रश्न पूछ सकते हैं "क्यों SQL सर्वर एक गैर-संकुल अनुक्रमणिका को लॉक करता है?"
नाम स्तंभ को AK_Department_Name गैर-संकुल अनुक्रमणिका में अनुक्रमित किया गया है और हम नाम को बदलने का प्रयास करते हैं कॉलम। इस मामले में, SQL सर्वर को उस कॉलम पर किसी भी गैर-संकुल अनुक्रमणिका को बदलने की आवश्यकता है। गैर-संकुल सूचकांक लीफ स्तर में छांटे गए प्रत्येक कुंजी मान को शामिल किया जाता है।
निष्कर्ष
इस लेख में, हमने SQL सर्वर लॉक तंत्र की मुख्य पंक्तियों का उल्लेख किया और sys.dm_tran_locks के उपयोग पर विचार किया। Sys.dm_tran_locks दृश्य वर्तमान में सक्रिय लॉक संसाधनों के बारे में बहुत सारी जानकारी देता है। अगर आप गूगल करते हैं, तो आप इस दृश्य के बारे में ढेर सारे नमूना प्रश्न पा सकते हैं।
संदर्भ
SQL सर्वर ट्रांजेक्शन लॉकिंग और रो वर्जनिंग गाइड
SQL सर्वर, ऑब्जेक्ट को लॉक करता है