परिचय
रिलेशनल डेटाबेस एसीआईडी गुणों का पालन करते हैं कि वे लेनदेन को कैसे लागू करते हैं - परमाणुता, संगति, अलगाव और स्थायित्व। अलगाव यह सुनिश्चित करने के लिए आवश्यक है कि कई लेन-देन डेटा में परिवर्तन का कारण नहीं बन सकते हैं और अंतिम परिणाम असंगत छोड़ सकते हैं। यह सुनिश्चित करने के लिए कि संचालन अलग-थलग रहे, SQL सर्वर लॉकिंग तंत्र लागू करता है।
लॉक मोड और पदानुक्रम
समवर्ती नियंत्रण के लिए SQL सर्वर का तंत्र शामिल है। लॉक वेट, डेडलॉक और इसी तरह के संदर्भ में प्रदर्शन को अनुकूलित करने के लिए, आपको विशिष्ट परिदृश्य के आधार पर निर्णय लेना होगा।
SQL सर्वर में, लॉक को विभिन्न तरीकों से और ग्रैन्युलैरिटी के कई स्तरों पर आयोजित किया जा सकता है। लॉक मोड करने के विशिष्ट तरीके हैं, और उनके स्तर लॉक पदानुक्रम हैं।
चित्र 1 डिफ़ॉल्ट लेनदेन अलगाव स्तर के लिए SQL सर्वर में उपलब्ध लॉक मोड दिखाता है (पढ़ें प्रतिबद्ध):
लॉक एस्केलेशन का अवलोकन
SQL सर्वर कई स्तरों पर संसाधनों को लॉक कर सकता है। यह कार्यभार की प्रकृति के अनुसार सबसे कुशल कृत्यों पर निर्भर करता है। तालिका 1 उन संसाधनों को दिखाती है जिन्हें लॉक किया जा सकता है।
- अधिक दानेदार स्तर पर ताले (जैसे, पंक्ति स्तर के ताले) उच्च संगामिति और कम अवरोधन की अनुमति देते हैं।
- उच्च स्तर पर ताले (जैसे, टेबल लेवल लॉक) संगामिति को कम करते हैं। वास्तविक विवरण कितने समय तक चलता है, इसके आधार पर वे अधिक अवरोध पैदा कर सकते हैं।
SQL सर्वर आंतरिक मेट्रिक्स के अनुसार आवश्यक लॉकिंग स्तर चुनता है।
लॉक एस्केलेशन तब होता है जब लॉक को ग्रैन्युलैरिटी के महीन स्तर से मोटे स्तर में बदल दिया जाता है।
उदाहरण के लिए, रो लॉक को टेबल लॉक में बदलना (तालिका 1 देखें)।
संसाधन | विवरण |
RID | पंक्ति पहचानकर्ता एक ही पंक्ति को ढेर में लॉक करने के लिए उपयोग किया जाता है। |
कुंजी | अनुक्रमणीय लेन-देन में प्रमुख श्रेणियों की सुरक्षा के लिए उपयोग किए जाने वाले अनुक्रमणिका के भीतर पंक्ति लॉक। |
पेज | डेटाबेस में 8-किलोबाइट (KB) पृष्ठ, जैसे डेटा या अनुक्रमणिका पृष्ठ। |
विस्तार | आठ पृष्ठों का सन्निहित समूह, जैसे डेटा या अनुक्रमणिका पृष्ठ। |
होबीटी | ढेर या बी-पेड़। लॉक एक तालिका में बी-ट्री (इंडेक्स) या हीप डेटा पेज की सुरक्षा कर रहा है जिसमें क्लस्टर इंडेक्स नहीं है। |
टेबल | सभी डेटा और अनुक्रमणिका सहित संपूर्ण तालिका। |
फ़ाइल | डेटाबेस फ़ाइल। |
आवेदन | एप्लिकेशन-निर्दिष्ट संसाधन। |
मेटाडेटा | मेटाडेटा लॉक. |
ALLOCATION_UNIT | आवंटन इकाई। |
डेटाबेस | संपूर्ण डेटाबेस। |
तालाबंदी बढ़ाने का तर्क
SQL सर्वर में ताले काफी महंगे हो सकते हैं। लॉक मैनेजर द्वारा प्राप्त प्रत्येक लॉक के लिए, SQL सर्वर को मेमोरी आरक्षित करनी चाहिए - 64 बाइट्स या 128 बाइट्स। राशि इस बात पर निर्भर करती है कि हम क्रमशः 32-बिट या 64-बिट सिस्टम के साथ काम कर रहे हैं या नहीं।
जैसे-जैसे तालिका में पंक्ति लॉक की संख्या बढ़ती है, SQL सर्वर को अधिक से अधिक मेमोरी प्राप्त करनी चाहिए। इसलिए, अन्य प्रक्रियाएं स्मृति से बाहर भूख से मर रही हैं।
पंक्ति लॉक और पेज लॉक को सिंगल टेबल (ऑब्जेक्ट) लेवल लॉक में बदलना समझ में आता है। ऐसा तब होता है जब उस टेबल के लिए ताले की संख्या 5000 से अधिक हो जाती है।
समझौता तब होता है जब लेन-देन प्रक्रिया में अन्य सत्रों के लिए पूरी तालिका उपलब्ध नहीं होती है।
लॉक एस्केलेशन प्रदर्शित करना
हम लिस्टिंग 1 में कोड का उपयोग करके लॉक एस्केलेशन प्रदर्शित कर सकते हैं।
आइए पहले तालिका का थोड़ा वर्णन करें। उत्पादन.उत्पादI लगभग 7777 पंक्तियों वाली एक अपेक्षाकृत छोटी तालिका है। भवन तत्व 77 पंक्तियों के समान सेट हैं जिन्हें 101 बार दोहराया गया है। लिस्टिंग 1 में कोड में एक ही अपडेट स्टेटमेंट के तीन संस्करण हैं, प्रत्येक एक लेनदेन में संलग्न है।
-- Listing 1: Demonstrating Lock Escalation
-- Update very few rows
BEGIN TRAN
use TSQLV4
GO
UPDATE Production.ProductsI SET unitprice='100.00'
WHERE unitprice='18.00';
ROLLBACK
-- Update a large number of rows
BEGIN TRAN
use TSQLV4
GO
UPDATE Production.ProductsI SET unitprice='100.00'
WHERE unitprice>'18.00';
ROLLBACK
-- Update over 5000 rows
BEGIN TRAN
use TSQLV4
GO
UPDATE Production.ProductsI SET unitprice='100.00';
ROLLBACK
अधिक स्पष्टता के लिए, हम लिस्टिंग 1 की सामग्री को तोड़ेंगे।
इससे पहले, आइए लिस्टिंग 2 देखें - TSQLV4 डेटाबेस में रखे गए लॉक को प्रदर्शित करने के लिए एक क्वेरी।
हमारा पहला कार्य लिस्टिंग 1 ए को निष्पादित करना है। फिर, हम लिस्टिंग 2 का उपयोग यह जांचने के लिए करते हैं कि लॉक मैनेजर परिदृश्य में लॉकिंग कैसे करता है। हम रोलबैक स्टेटमेंट जारी किए बिना लिस्टिंग 1a निष्पादित करते हैं। इस तरह, हम ताले को लंबे समय तक सुरक्षित रखते हैं, ताकि लिस्टिंग 2 की क्वेरी उन्हें पकड़ सके।
-- Listing 1a: Demonstrating Lock Escalation
-- Update very few rows
BEGIN TRAN
use TSQLV4
GO
UPDATE Production.ProductsI SET unitprice='100.00'
WHERE unitprice='18.00';
ROLLBACK
-- Listing 2: Displaying Locks Held in Database TSQLV4
USE TSQLV4
GO
SELECT
resource_type
, DB_NAME (resource_database_id) database_name
--, OBJECT_NAME(resource_associated_entity_id) resource_name
, request_mode
, request_type
, request_status
, request_reference_count
, request_session_id
, resource_associated_entity_id
, OBJECT_NAME(resource_associated_entity_id) [object_name] --small obj ids
, getuser.login_name
FROM sys.dm_tran_locks
CROSS APPLY dmv.dbo.getuser(request_session_id) as getuser
WHERE DB_NAME (resource_database_id)='TSQLV4';
जब हम लिस्टिंग 1a में क्वेरी चलाते हैं, और फिर लिस्टिंग 2 में क्वेरी का उपयोग करके ताले की जाँच करते हैं, तो SQL सर्वर चित्र 2 में दिखाया गया परिणाम देता है।
तालिका में 404 पंक्तियों में unitprice='18.00' . है . लॉक मैनेजर इन पंक्तियों को किसी भी आवश्यक स्तर के अन्य तालों के साथ लॉक कर देता है। यह चित्र 2 पंक्ति संख्या को 467 पर लाता है।
-- Listing 1b: Demonstrating Lock Escalation
-- Update a large number of rows
BEGIN TRAN
use TSQLV4
GO
UPDATE Production.ProductsI SET unitprice='100.00'
WHERE unitprice>'18.00';
ROLLBACK
जब हम लिस्टिंग 1b में क्वेरी निष्पादित करते हैं तो हम समान व्यवहार देखते हैं। इस बार, हम 4406 पंक्तियों के साथ काम कर रहे हैं। यह तालिका उत्पादन पर पंक्तियों की संख्या को दर्शाता है। उत्पाद I की इकाई मूल्य> 18.00 है।
-- Listing 1c: Demonstrating Lock Escalation
-- Update over 5000 rows
BEGIN TRAN
use TSQLV4
GO
UPDATE Production.ProductsI SET unitprice='100.00';
ROLLBACK
जब हम आगे बढ़ते हैं और लिस्टिंग 1c में कोड निष्पादित करते हैं, तो हम एक अलग व्यवहार देखते हैं (चित्र 4 देखें)।
लिस्टिंग 1c Production.ProductI तालिका में सभी 7777 पंक्तियों को अद्यतन करने का प्रयास करता है। SQL सर्वर निर्धारित करता है कि अलगाव की गारंटी देने के लिए इतनी सारी पंक्तियों को लॉक करना अब कुशल नहीं है। इसके बजाय, पूरी तालिका बंद है।
लॉक एस्केलेशन के बारे में अधिक जानकारी
टेबल लॉक का अर्थ है कि कोई अन्य सत्र लेन-देन की अवधि के लिए अपनी पंक्तियों को संशोधित नहीं कर सकता है, जो तब भी हो सकता है जब एक अवरुद्ध सत्र तालिका में सभी पंक्तियों में हेरफेर नहीं करता है।
यह भी ध्यान देने योग्य है कि अन्य कारक प्रभावित कर सकते हैं कि SQL सर्वर में ताले कैसे प्राप्त किए जाते हैं और आगे बढ़ते हैं। वे आइसोलेशन स्तर कॉन्फ़िगर किए गए, अनुक्रमणित करने और ट्रेस फ़्लैग हैं।
ट्रेस फ्लैग T1211 और T1224 लॉक एस्केलेशन को पूरी तरह से अक्षम करने के लिए लागू हो सकते हैं। निम्नलिखित कोड के साथ एक विशिष्ट तालिका के लिए लॉक एस्केलेशन अक्षम और सक्षम भी हो सकता है:
-- Listing 5: Disable and Enable Lock Escalation
ALTER TABLE Production.ProductsI SET (LOCK_ESCALATION=DISABLE);
ALTER TABLE Production.ProductsI SET (LOCK_ESCALATION=TABLE);
संपूर्ण तालिका को लॉक करने से संबंधित अवरोध को कम करने के लिए कोई ऐसा करना चाह सकता है। स्मृति पर प्रभाव के कारण, इसे अस्थायी उपाय पर विचार किया जाना चाहिए।
निष्कर्ष
SQL सर्वर सर्वर संसाधनों पर अधिक बारीक लॉकिंग के प्रभाव को नियंत्रित करने के लिए लॉक एस्केलेशन का उपयोग करता है। इन तालों की घटनाओं के तरीके को प्रदर्शित करने के लिए - पंक्ति ताले, पृष्ठ ताले, ऑब्जेक्ट लॉक, आदि - sys.dm_tran_locks गतिशील प्रबंधन दृश्य को क्वेरी करें। यह Lock Escalation के अलावा Locking के बारे में बहुत सारी जानकारी प्रदान करता है।
हालांकि लॉक मैनेजर के व्यवहार में हेरफेर करना संभव है, लेकिन इसे बहुत सावधानी से करना आवश्यक है। ऐसे संशोधन करने के लिए निर्देशित किसी भी प्रयास के सटीक प्रदर्शन प्रभाव को जानना भी महत्वपूर्ण है।
संदर्भ
- कोरोटकेविच, डी., 2016। प्रो एसक्यूएल सर्वर इंटर्नल। फ़्लोरिडा:दिमित्री कोरोटकेविच
- sys.dm_tran_locks का उपयोग करके परिदृश्यों को लॉक करें
- लेन-देन लॉकिंग और पंक्ति संस्करण मार्गदर्शिका