लॉकिंग को समझें
बहु-संस्करण संगामिति नियंत्रण (MVCC) अधिकांश परिदृश्यों के लिए उपयुक्त संगामिति सेटिंग्स प्रदान करता है। हालांकि, यदि किसी एप्लिकेशन को विशिष्ट लॉक की आवश्यकता होती है जो नियंत्रित करते हैं कि कौन सी पंक्तियां प्रभावित होती हैं और एक विशिष्ट लॉक स्तर के साथ, तो स्पष्ट लॉक मोड इस महीन नियंत्रण को सक्षम करते हैं।
PostgreSQL के लिए Azure डेटाबेस में, तीन प्रकार के स्पष्ट लॉक, टेबल-लेवल लॉक, पंक्ति-स्तर-लॉक और पेज-स्तरीय लॉक हैं। प्रारंभिक लेनदेन लॉक मांगता है और यदि स्वीकार किया जाता है, तो अनुरोधित लॉक मौजूदा लॉक बन जाता है। यदि कोई अन्य लेन-देन उसी डेटा पर लॉक निकालने का प्रयास करता है, तो लॉक दिया जाता है यदि यह मूल लेनदेन के साथ संघर्ष नहीं करता है।
उदाहरण के लिए, दो लेनदेन एक ही समय में एक ही डेटा को SELECT कथन के साथ क्वेरी कर सकते हैं। ये अनुरोध एक एक्सेस शेयर लॉक का उपयोग करेंगे और उन दोनों को अनुमति दी जाएगी। किसी अन्य परिदृश्य में, एक हस्तांतरण डेटा का चयन करें कथन और एक पहुँच साझा अवरोध के साथ क्वेरी कर रहा है, लेकिन एक ही समय में एक ही तालिका ड्रॉप करने के लिए एक ही समय में किसी अन्य हस्तांतरण का प्रयास करता है। तालिका छोड़ने के लिए एक ACCESS EXCLUSIVE लॉक की आवश्यकता होती है, जो इस परिदृश्य में प्रदान नहीं किया जाएगा।
टेबल-लेवल लॉक
टेबल स्तर के ताले पूरी मेज पर ताले प्राप्त करते हैं, भले ही उनके नाम में आरओडब्ल्यू हो। यदि तालिका स्वयं संशोधित की जा रही है, तो पूरी तालिका को लॉक करने की आवश्यकता हो सकती है, या कई पंक्ति-स्तरीय तालों को बाहर निकालने की तुलना में अधिक कुशल हो सकता है।
PostgreSQL के लिए Azure डेटाबेस में आठ प्रकार के टेबल-स्तरीय लॉक हैं और इस प्रकार के लॉक प्राप्त करने वाले SQL कमांड हैं:
| लॉक मोड | द्वारा अधिग्रहित |
|---|---|
| एक्सेस शेयर | SELECT आदेश |
| पंक्ति साझा | अपडेट के लिए चुनें और शेयर कमांड के लिए चुनें |
| पंक्ति अनन्य | अद्यतन, हटाएँ, और सम्मिलित आदेश |
| शेयर अपडेट एक्सक्लूसिव | विश्लेषण करें, समवर्ती रूप से सूचकांक बनाएं, आंकड़े बनाएं, टिप्पणी करें, समवर्ती आदेशों को फिर से अनुक्रमित करें, कुछ ALTER INDEX और ALTER TABLE कमांड, और VACUUM (पूर्ण नहीं) |
| पत्ती | CREATE INDEX (CONCURRENT नहीं) कमांड |
| शेयर पंक्ति अनन्य | TRIGGER कमांड और कुछ ALTER TABLE कमांड बनाएं |
| निवारक | ताज़ा करें भौतिकीकृत दृश्य समवर्ती आदेश |
| एक्सेस एक्सक्लूसिव | ड्रॉप टेबल, रीइंडेक्स, ट्रंकेट, क्लस्टर, रिफ्रेश मटेरियलाइज्ड व्यू (समवर्ती नहीं) कमांड, अधिकांश ऑल्टर इंडेक्स और ऑल्टर टेबल कमांड, और वैक्यूम फुल |
प्रत्येक प्रकार के मौजूदा लॉक ब्लॉक अन्य अनुरोधित ताले प्राप्त किए जा रहे हैं। निम्न तालिका सूचीबद्ध करती है कि कौन से ताले अन्य तालों को प्राप्त होने से रोकते हैं:
| -- | मौजूदा ACCESS साझा | मौजूदा ROW शेयर | मौजूदा ROW EXCLUSIVE | मौजूदा शेयर अपडेट एक्सक्लूसिव | मौजूदा शेयर | मौजूदा SHARE ROW EXCL | मौजूदा अनन्य | मौजूदा एक्सेस एक्सक्लूसिव |
|---|---|---|---|---|---|---|---|---|
| अनुरोधित ACCESS SHARE | अवरुद्ध | |||||||
| अनुरोधित ROW शेयर | अवरुद्ध | अवरुद्ध | ||||||
| अनुरोधित ROW EXCLUSIVE | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | ||||
| अनुरोधित शेयर अपडेट एक्सक्लूसिव | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | |||
| अनुरोधित शेयर | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | |||
| अनुरोधित शेयर पंक्ति अनन्य | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | ||
| अनुरोधित विशेष | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | |
| अनुरोधित ACCESS EXCLUSIVE | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध |
पंक्ति-स्तर के ताले
पंक्ति स्तर लॉक अधिक दानेदार होते हैं और केवल एक ही पंक्ति तक पहुंचने वाले किसी अन्य लेनदेन को प्रभावित करते हैं। यह लॉक प्रकार समवर्ती में सुधार करता है, लेकिन कई तालों को प्राप्त करना और छोड़ना प्रदर्शन को नकारात्मक रूप से प्रभावित करता है। पंक्ति-स्तरीय ताले स्वचालित रूप से PostgreSQL द्वारा अधिग्रहित किए जाते हैं और मैन्युअल रूप से लागू नहीं होते हैं।
PostgreSQL के लिए Azure डेटाबेस में चार प्रकार के पंक्ति-स्तरीय लॉक हैं और उन्हें इस आधार पर अधिग्रहित किया जाता है कि किन अन्य लॉक प्रकारों को अवरुद्ध करने की आवश्यकता है:
| -- | कुंजी शेयर के लिए मौजूदा | शेयर के लिए मौजूदा | कोई महत्वपूर्ण अद्यतन के लिए मौजूदा | अद्यतन के लिए मौजूदा |
|---|---|---|---|---|
| कुंजी शेयर के लिए अनुरोध किया | अवरुद्ध | |||
| शेयर के लिए अनुरोध किया | अवरुद्ध | अवरुद्ध | ||
| कोई महत्वपूर्ण अपडेट के लिए अनुरोध नहीं किया गया | अवरुद्ध | अवरुद्ध | अवरुद्ध | |
| अपडेट के लिए अनुरोध किया गया | अवरुद्ध | अवरुद्ध | अवरुद्ध | अवरुद्ध |
पृष्ठ-स्तरीय लॉक
पृष्ठ-स्तरीय लॉक डेटा के किसी पृष्ठ को प्रभावित करते हैं, जिसमें आमतौर पर एकाधिक पंक्तियाँ होती हैं. हालांकि PostgreSQL प्रक्रियाएं पृष्ठ-स्तरीय ताले का उपयोग करती हैं, एप्लिकेशन डेवलपर्स को आमतौर पर इस प्रकार के लॉक की आवश्यकता नहीं होती है।
मैन्युअल रूप से ताले लगाना और वर्तमान ताले देखना
तालिका-स्तरीय लॉक को मैन्युअल रूप से लागू करने के लिए, आप आवश्यक लॉक मोड के साथ लॉक आदेश का उपयोग कर सकते हैं। LOCK कमांड एक लेनदेन के भीतर होना चाहिए और लेनदेन पूरा होने पर लॉक जारी किए जाते हैं। उदाहरण के लिए:
BEGIN TRANSACTION;
LOCK TABLE humanresources.department IN ROW EXCLUSIVE MODE;
COMMIT;
डेटाबेस पर वर्तमान में रखे गए लॉक को देखने के लिए, pg_locksका उपयोग करें. उदाहरण के लिए, सभी मौजूदा लॉक देखने के लिए, निम्न कमांड का उपयोग करें:
SELECT * FROM pg_locks;