2011-09-14 23 views
5

नीचे कथन के बारे में REPEATABLE READSडेटाबेस लेनदेन में विभिन्न अलगाव स्तर पर कुछ स्पष्टीकरण?

इस अलगाव स्तर में Wikipedia's Isolation article से लिखा है, एक ताला आधारित संगामिति नियंत्रण डीबीएमएस कार्यान्वयन पढ़ सकते हैं और ताले (चयनित डेटा पर अधिग्रहीत) बारे में लेन-देन के अंत तक रहता है। हालांकि, रेंज-लॉक प्रबंधित नहीं होते हैं, इसलिए प्रेत घटना को पढ़ सकता है (नीचे देखें)।

मेरा प्रश्न यह है कि लेनदेन क्रमशः शुरू होता है और अंत में होता है।

हम गैर repeatable का उदाहरण लेते हैं पढ़ता के साथ repeatable एक ही लिंक पर अलगाव स्तर पढ़ता है, मेरी समझ के अनुसार trnsaction 1 शुरू जब पहली क्वेरी निकाल दिया जाता है यानी SELECT * FROM users WHERE id = 1. डीबीएमएस जब तक उन मेज पर ताला रखेंगे और जब तक लेनदेन समाप्त नहीं हो जाता है। यहां अंत तक मेरा मतलब है कि जब कनेक्शन रोलडबैक हो जाता है या SELECT * FROM users WHERE id = 1 के पूरा होने पर नहीं किया जाता है। उस समय तक लेनदेन 2 सही इंतजार करेगा?


प्रश्न 2: - अब अगर हम अलगाव के स्तर और उनके व्यवहार के रूप में नीचे दिए गए (एक ही लिंक पर)

Isolation level  Dirty reads Non-repeatable Phantoms 
Read Uncommitted may occur  may occur  may occur 
Read Committed  -    may occur  may occur 
Repeatable Read  -    may occur  - 
Serializable  -    -    - 

मेरी समझ के अनुसार विचार करना सबसे विश्वसनीय है Serializable तो Repeatable पढ़ें और उसके बाद प्रतिबद्ध पढ़ें लेकिन फिर भी मैंने पढ़ी गई पढ़ाई का उपयोग करके अनुप्रयोगों को देखा है। ऐसा इसलिए है क्योंकि सीरियलज़ेबल और दोहराए जाने योग्य पढ़ने के प्रदर्शन की तुलना में खराब है क्योंकि धारावाहिक में यह अनुक्रमिक होगा और लेनदेन के मामले में किसी अन्य लेनदेन द्वारा लॉक जारी करने की प्रतीक्षा करनी होगी। सही? तो तीनों में से सर्वश्रेष्ठ प्राप्त करने के लिए हम अलगाव स्तर का उपयोग कर सकते हैं क्योंकि SELECT FOR UPDATE (दोहराने योग्य पढ़ने को प्राप्त करने के लिए) के साथ प्रतिबद्ध पढ़ें। अगर हम चाहते हैं कि हम पढ़ने के मामले में प्रेत को अलगाव स्तर के मामले में कैसे पढ़ सकते हैं, तो हम निश्चित रूप से कैसे पढ़ सकते हैं?

+0

देखें http://stackoverflow.com/questions/10935850/when 'चयन ... अद्यतन के लिए – Gili

+0

की चर्चा के लिए-टू-यूज-टू-अपडेट-अपडेट-अपडेट तीनों में से सर्वश्रेष्ठ हम अलगाव स्तर का उपयोग कर सकते हैं क्योंकि अद्यतन के लिए चयन के साथ प्रतिबद्ध पढ़ें - यह डीडीएन्यूक्लियस जैसे जेडीओ दृढ़ता परतों का दृष्टिकोण है। वे प्रति लेनदेन के आधार पर "अद्यतन के लिए चयन" को नियंत्रित करने के लिए एक तंत्र प्रदान करते हैं। मेरा मानना ​​है कि यह दृष्टिकोण "निचले" लेनदेन प्रकारों का उपयोग करते समय सीरियलज़ेबल लेनदेन लॉक तंत्र के लाभ प्रदान करेगा। – marcolopes

+0

क्या आप सुनिश्चित हैं कि "दोहराने योग्य" अलगाव स्तर "लेन-देन योग्य" अलगाव स्तर के साथ लेनदेन में हो सकता है? इस आलेख में तालिका अलग है - http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html – naXa

उत्तर

6

ओरेकल REPEATABLE READ अलगाव स्तर का समर्थन नहीं करता है। हालांकि, SQL सर्वर करता है - और यह तब तक लेन-देन द्वारा चुनी गई सभी पंक्तियों पर ताले लगाता है जब तक कि यह समाप्त न हो (यानी: यह प्रतिबद्ध है या वापस लुढ़का हुआ है)। तो आप सही हैं, यह वास्तव में अन्य लेन-देन का इंतजार करेगा (यदि वे लॉक किए गए डेटा को अपडेट कर रहे हैं) और समेकन के लिए हानिकारक हो सकते हैं।

प्रश्न 2 के लिए: हां, अलगाव स्तर जितना अधिक होगा, उतना ही बदतर आपके समवर्ती लेनदेन प्रदर्शन करेंगे क्योंकि उन्हें अधिक ताले जारी होने की प्रतीक्षा करनी होगी। मुझे यकीन नहीं है कि SELECT FOR UPDATE का उपयोग करके "तीनों में से सर्वश्रेष्ठ प्राप्त करने" का क्या मतलब है क्योंकि SELECT FOR UPDATE सभी चयनित पंक्तियों पर पंक्ति ताले रखेगा।

और अंत में, यहाँ प्रेत पर Oracle की पुस्तिका से एक उद्धरण है पढ़ता है:

एक सौदे में एक ही खोज हालत संतुष्ट करता है और है कि एक और प्रतिबद्ध लेनदेन पाता पंक्तियों का एक सेट लौटने एक प्रश्न reruns [प्रेत होते हैं जब पढ़ता] इस शर्त को पूरा करने वाली अतिरिक्त पंक्तियां डाली हैं।

उदाहरण के लिए, एक लेनदेन कर्मचारियों की संख्या से पूछताछ करता है।पांच मिनट बाद यह वही क्वेरी करता है, लेकिन अब संख्या में वृद्धि हुई है क्योंकि किसी अन्य उपयोगकर्ता ने एक नए किराए के लिए रिकॉर्ड डाला है। अधिक डेटा पहले से पूछताछ क्वेरी मानदंडों को पूरा करता है, लेकिन एक अस्पष्ट पढ़ने के विपरीत पहले पढ़ा गया डेटा अपरिवर्तित है।


संदर्भ:

+0

"मुझे यकीन नहीं है कि आपका क्या मतलब है" सर्वश्रेष्ठ प्राप्त करना तीनों "मूल रूप से मैं यहां पूछने की कोशिश कर रहा हूं कि अगर हम ओरेकल में पढ़ा गया अलगाव स्तर का उपयोग करते हैं, तो हम अभी भी दोहराए जाने योग्य और प्रेत पढ़ने वाले मुद्दों को प्राप्त करेंगे। सही? मेरी समझ के अनुसार सबसे पहले हमें उन्हें मुद्दों के रूप में नहीं बुलाया जाना चाहिए लेकिन इन्हें सही व्यवहार के रूप में माना जाना चाहिए क्योंकि दूसरे लेनदेन के बीच पहले लेनदेन के बीच हमें अद्यतन डेटा प्राप्त करना चाहिए। सही? जारी ... –

+1

जारी रहा ... दूसरा सवाल यह है कि यदि हम गैर दोहराने योग्य और प्रेत पढ़ने के मुद्दों से बचना चाहते हैं ओरेकल पर पढ़ने के साथ, क्या कोई रास्ता है? मेरे अनुसार यदि हम अद्यतन क्वेरी के लिए चयन का उपयोग करते हैं तो हमें गैर-पुन: प्रयोज्य पढ़ने से बचाया जा सकता है। सामग्री? लेकिन सुनिश्चित नहीं है कि हम कैसे प्रेत से बच सकते हैं? –

संबंधित मुद्दे