PostgreSQL ठोस, समय-परीक्षणित सुविधाओं के साथ आता है जो आपको यह परिभाषित करने देता है कि क्या होना चाहिए जब कई क्लाइंट एक ही डेटा को एक साथ अपडेट करने का प्रयास करते हैं। उनमें से एक लेनदेन का अलगाव स्तर है।
PostgreSQL में लेन-देन अलगाव कैसे काम करता है, इसके बारे में और जानने के लिए पढ़ें।
लेन-देन और अलगाव स्तर
RDBMS में डेटा को बदलने के लिए लेन-देन मौलिक तरीका है। आधुनिक RDBMS एक से अधिक लेन-देन को एक साथ चलने की अनुमति देता है, और इसके परिणामस्वरूप एप्लिकेशन डेवलपर्स के लिए विभिन्न प्रकार के टूल आते हैं - कुछ मानक, कुछ RDBMS-विशिष्ट - यह निर्दिष्ट करने के लिए कि उनके लेनदेन को अन्य लेनदेन के साथ कैसे इंटरैक्ट करना चाहिए या नहीं करना चाहिए।
लेन-देन अलगाव स्तर और निराशावादी ताले ऐसे दो उपकरण हैं। हालांकि ये डेटा अखंडता और प्रदर्शन के लिए आवश्यक हैं, दुर्भाग्य से ये समझने या उपयोग करने के लिए सहज नहीं हैं।
PostgreSQL में लेन-देन का अलगाव स्तर निम्न में से एक हो सकता है:
- प्रतिबद्ध पढ़ें
- दोहराने योग्य पढ़ें
- धारावाहिक
प्रत्येक लेन-देन का अलगाव स्तर इनमें से किसी एक पर सेट होने पर होता है। डिफ़ॉल्ट स्तर "पढ़ें प्रतिबद्ध" है।
ध्यान दें कि SQL मानक "अनकमिटेड रीड" को भी परिभाषित करता है, जो पोस्टग्रेज़ में समर्थित नहीं है। आपको "पढ़ने के लिए प्रतिबद्ध" के निकटतम, उच्च स्तर का उपयोग करना होगा।
आइए देखें कि इन स्तरों का क्या अर्थ है।
प्रतिबद्ध पढ़ें
क्या होता है जब एक (अधूरा) लेन-देन तालिका में पंक्तियों को सम्मिलित करता है और दूसरा (अधूरा भी) लेन-देन तालिका में सभी पंक्तियों को पढ़ने का प्रयास करता है? यदि दूसरा लेन-देन पहले द्वारा डाली गई पंक्तियों को देखने में सक्षम है, तो उस रीडिस को डर्टी रीड कहा जाता है - क्योंकि पहला लेन-देन रोलबैक कर सकता है और दूसरा लेन-देन "प्रेत" पंक्तियों को पढ़ेगा जो कभी अस्तित्व में नहीं थे।
पढ़ने के लिए प्रतिबद्ध अलगाव स्तर गारंटी देता है कि गंदा पढ़ना कभी नहीं होगा। यहां एक उदाहरण दिया गया है:
जैसा कि आप देख सकते हैं, दूसरा लेन-देन पहले लेन-देन के रूप में अभी तक अप्रतिबद्ध डेटा नहीं पढ़ सका। PostgreSQL में, अलगाव स्तर को इस स्तर से नीचे करना संभव नहीं है ताकि गंदे पढ़ने की अनुमति हो।
रिपीटेबल रीड
फिर भी एक और समस्या गैर-दोहराए जाने योग्य पठन की है। ऐसा तब होता है जब एक लेन-देन एक पंक्ति पढ़ता है, और फिर इसे थोड़ी देर बाद फिर से पढ़ता है लेकिन एक अलग परिणाम प्राप्त करता है - क्योंकि पंक्ति को दूसरे लेनदेन द्वारा अद्यतन किया गया था। पठन गैर-दोहराने योग्य बन गया है , जैसा कि इस उदाहरण में दिखाया गया है:
इस समस्या को ठीक करने के लिए, लेन-देन के आइसोलेशन स्तर को "रिपीटेबलरीड" पर सेट करें। PostgreSQL तब सुनिश्चित करेगा कि दूसरा (या कोई भी) पढ़ा गया परिणाम भी पहले पढ़ने के समान परिणाम देगा। यहां अपग्रेड किए गए आइसोलेशन स्तर पर यही परिदृश्य है:
ध्यान दें कि अलगाव स्तर BEGINकथन के साथ निर्दिष्ट किया गया था। इसे एक कॉन्फ़िगरेशन पैरामीटर (default_transaction_isolation
) के रूप में कनेक्शन स्तर (कनेक्शन पैरामीटर के रूप में) पर निर्दिष्ट करना भी संभव है। ) और SET TRANSACTION स्टेटमेंट का उपयोग करना।
Serializable
अगला अलगाव स्तर खोए हुए अपडेट . की समस्या का समाधान करता है . एक लेन-देन में किए गए अपडेट "खो गए" हो सकते हैं, या किसी अन्य लेनदेन द्वारा अधिलेखित हो सकते हैं जो एक साथ चलने के लिए होता है, जैसा कि यहां दिखाया गया है:
यहां दूसरे लेन-देन का अद्यतन ब्लॉक है, क्योंकि PostgreSQL पहला लेनदेन समाप्त होने तक दूसरे अपडेट को रोकने के लिए लॉक रखता है। हालांकि, पहले लेन-देन का परिवर्तन खो गया है, क्योंकि दूसरा लेन-देन "ओवरराइट" कर चुका है।
यदि इस प्रकार का व्यवहार स्वीकार्य नहीं है, तो आप आइसोलेशन स्तर को क्रमानुसार अपग्रेड कर सकते हैं:
इस स्तर पर, दूसरे लेनदेन की प्रतिबद्धता विफल हो जाती है। दूसरे लेन-देन की कार्रवाइयां उन तथ्यों पर आधारित थीं, जो उस समय तक अमान्य हो गए थे, जब वह प्रतिबद्ध होने वाला था।
जबकि क्रमांकन उच्चतम स्तर की सुरक्षा प्रदान करता है, इसका अर्थ यह भी है कि एप्लिकेशन को ऐसी प्रतिबद्ध विफलताओं का पता लगाना होगा और संपूर्ण लेन-देन का पुनः प्रयास करना होगा।