बार-बार पढ़ने में असंगतता


10

http://www.postgresql.org/docs/9.2/static/transaction-iso.html

बार-बार पढ़ने योग्य मोड एक कठोर गारंटी प्रदान करता है कि प्रत्येक लेनदेन डेटाबेस का पूरी तरह से स्थिर दृश्य देखता है। हालाँकि, यह दृश्य हमेशा कुछ धारावाहिकों (एक समय में) के समान स्तर के समवर्ती लेनदेन के निष्पादन के अनुरूप नहीं होगा। उदाहरण के लिए, यहां तक ​​कि इस स्तर पर केवल पढ़ने के लिए लेन-देन को नियंत्रित किया जा सकता है, जो यह दर्शाता है कि एक बैच पूरा हो चुका है, लेकिन एक भी विवरण रिकॉर्ड नहीं देखें, जो तार्किक रूप से बैच का हिस्सा हो, क्योंकि यह नियंत्रण रिकॉर्ड के पहले के संशोधन को पढ़ता है । इस अलगाव स्तर पर चल रहे लेनदेन द्वारा व्यावसायिक नियमों को लागू करने का प्रयास परस्पर विरोधी लेनदेन को अवरुद्ध करने के लिए स्पष्ट ताले के सावधानीपूर्वक उपयोग के बिना सही ढंग से काम करने की संभावना नहीं है।

क्या वह प्रेत पाठ नहीं है, जो बार-बार पढ़ी जाने वाली विधा में संभव नहीं है?

दस्तावेज़ीकरण कहता है कि एक बार-बार पढ़ने वाले लेन-देन में एक क्वेरी लेनदेन की शुरुआत के रूप में एक स्नैपशॉट देखता है, फिर एक क्वेरी के लिए असंगत डेटा को पढ़ना कैसे संभव हो सकता है?

जवाबों:


5

यहाँ उस सेक्शन का मेरा पढ़ना है। मैं इसे कबूल करूंगा।

मान लीजिए कि मेरे पास दो टेबल हैं:

CREATE TABLE batch (
   id serial not null unique,
   control_code text primary key,
   date_posted date not null default now()
);

CREATE TABLE details (
   batch_id int not null references batch(id),
   description text,
   primary key(batch_id, description)
);

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

यह अनुक्रमिक से भिन्न होगा जहां आप उपयोगकर्ता को सूचित करने से पहले पिछली प्रविष्टि को पूरा करने और कमिट या रोलबैक की प्रतीक्षा करने की अपेक्षा करेंगे कि कोई पंक्तियाँ नहीं मिलीं।


3

नहीं है एक दस्तावेज PostgreSQL विकी में है कि कुछ समस्याओं जो repeatable पढ़ें लेनदेन अलगाव स्तर पर लेन-देन के कुछ संयोजन के साथ हो सकता दिखाने के लिए, और कैसे वे PostgreSQL संस्करण 9.1 के साथ serializable लेनदेन अलगाव स्तर शुरुआत में परहेज कर रहे हैं।

इसमें एक उदाहरण भी शामिल है कि कैसे लगातार डेटा पढ़ने के लिए एक READATABLE READ-level READ-ONLY लेनदेन के लिए यह संभव हो सकता है।


@dezso आपको इसमें रुचि हो सकती है
907

1

फैंटम पढ़ता है (गैर-दोहराने योग्य रीड के साथ इसे भ्रमित नहीं करना सुनिश्चित करें) सिद्धांत रूप में "बार-बार पढ़ने योग्य" अलगाव स्तर में संभव है। लेकिन जब आप "बार-बार पढ़ने योग्य" का चयन करते हैं तो Postgresql de-facto व्यवहार मानक से अधिक मजबूत होता है, (लगभग एक "Serializable" आइसोलेशन), ताकि तथ्य की बात के रूप में आपके पास प्रेत रीड नहीं होंगे। डॉक्स :

जब आप स्तर का चयन करते हैं तो पढ़ें Uncommitted आप वास्तव में पढ़ने के लिए प्रतिबद्ध हो जाते हैं, और प्रेत रीड्स पुन: प्रयोज्य पढ़ें के PostgreSQL कार्यान्वयन में संभव नहीं हैं , इसलिए वास्तविक अलगाव स्तर आपके द्वारा चुने गए की तुलना में सख्त हो सकता है।

अब, उस चेतावनी के बारे में क्या है "यह दृष्टिकोण हमेशा कुछ धारावाहिक (एक समय में) समान स्तर के समवर्ती लेनदेन के निष्पादन के अनुरूप नहीं होगा"? मुझे लगता है कि (मुझे यकीन नहीं है) इसका मतलब है कि इसका मतलब है कि स्नैपशॉट "बाहर से" (लेनदेन की शुरुआत में तय) अंततः अन्य लेनदेन से पंक्तियों को शामिल कर सकता है लेकिन उसी लेनदेन से कुछ अन्य पंक्तियों को शामिल करने में विफल रहता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.