"पढ़ा हुआ" और "दोहराए गए पढ़ने" के बीच अंतर


245

मुझे लगता है कि उपरोक्त अलगाव स्तर एक जैसे हैं। क्या कोई कृपया कुछ अच्छे उदाहरणों के साथ वर्णन कर सकता है कि मुख्य अंतर क्या है?


3
आपको प्रश्न पर विस्तार करना चाहिए और "जावा (आदि) के लिए" अलगाव स्तर "के लिए टैग जोड़ना चाहिए। "अलगाव स्तर" कुछ अस्पष्ट शब्द है, और आप स्पष्ट रूप से एक विशिष्ट वातावरण के लिए जवाब मांग रहे हैं।
jesup

जवाबों:


564

पढ़ें प्रतिबद्ध एक अलग स्तर है कि गारंटी देता है कि किसी भी डेटा पढ़ने गया था प्रतिबद्ध पल में पढ़ा जाता है। यह पाठक को किसी भी मध्यवर्ती, बिना पढ़े, 'गंदे' पढ़ने से रोकता है। यह कोई वादा नहीं करता है कि यदि लेन-देन फिर से जारी करता है, तो वही डेटा मिलेगा, जिसे पढ़ने के बाद डेटा बदलने के लिए स्वतंत्र है।

बार-बार पढ़ा जाने वाला एक उच्च अलगाव स्तर है, कि रीड प्रतिबद्ध स्तर की गारंटी के अलावा, यह भी गारंटी देता है कि पढ़ा गया कोई भी डेटा नहीं बदल सकता है , यदि लेनदेन फिर से उसी डेटा को पढ़ता है, तो यह पहले से पढ़े गए डेटा को जगह में बदल देगा, अपरिवर्तित , और पढ़ने के लिए उपलब्ध है।

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

मान लें कि आपके पास एक स्तंभ C के साथ एक तालिका है जिसमें एक पंक्ति है, कहते हैं कि इसका मान '1' है। और विचार करें कि आपके पास निम्नलिखित की तरह एक सरल कार्य है:

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

यह एक सरल कार्य है जो टेबल टी से दो रीड जारी करता है, उनके बीच 1 मिनट की देरी होती है।

  • READ COMMITTED के तहत, दूसरा SELECT किसी भी डेटा को वापस कर सकता है । एक समवर्ती लेनदेन रिकॉर्ड को अपडेट कर सकता है, इसे हटा सकता है, नए रिकॉर्ड डाल सकता है। दूसरा चयन हमेशा नए डेटा को देखेगा ।
  • दोहराए जाने के तहत दूसरा चयन कम से कम उन पंक्तियों को प्रदर्शित करने की गारंटी है, जो पहले चयनित अपरिवर्तित से वापस आए थे । उस एक मिनट में एक समवर्ती लेनदेन द्वारा नई पंक्तियों को जोड़ा जा सकता है, लेकिन मौजूदा पंक्तियों को न तो हटाया जा सकता है और न ही बदला जा सकता है।
  • के तहत serializable दूसरे का चयन पढ़ता देखने के लिए गारंटी है कि वास्तव में पहले के रूप में ही पंक्तियों। कोई भी पंक्ति बदल नहीं सकती है, न ही हटाई जा सकती है, न ही नई पंक्तियों को समवर्ती लेनदेन द्वारा डाला जा सकता है।

यदि आप ऊपर दिए गए तर्क का पालन करते हैं, तो आप यह महसूस कर सकते हैं कि SERIALIZABLE लेन-देन, जबकि वे आपके लिए जीवन को आसान बना सकते हैं, हमेशा हर संभव समवर्ती ऑपरेशन को पूरी तरह से अवरुद्ध कर रहे हैं , क्योंकि उन्हें आवश्यकता है कि कोई भी पंक्ति को संशोधित, हटा या सम्मिलित नहीं कर सकता है। .Net System.Transactionsस्कोप का डिफ़ॉल्ट लेन-देन आइसोलेशन स्तर क्रमबद्ध होता है, और यह आमतौर पर परिणाम दिखाने वाले एबसिमल प्रदर्शन की व्याख्या करता है।

और अंत में, स्नैपशॉट अलगाव स्तर भी है। SNAPSHOT अलगाव स्तर क्रमबद्धता के समान गारंटी देता है, लेकिन यह आवश्यक नहीं है कि कोई समवर्ती लेनदेन डेटा को संशोधित न कर सके। इसके बजाय, यह हर पाठक को दुनिया के अपने संस्करण (यह खुद का 'स्नैपशॉट') देखने के लिए मजबूर करता है। यह प्रोग्राम के साथ-साथ बहुत ही स्केलेबल के खिलाफ प्रोग्राम करना आसान बनाता है क्योंकि यह समवर्ती अपडेट को ब्लॉक नहीं करता है। हालांकि, वह लाभ एक मूल्य के साथ आता है: अतिरिक्त सर्वर संसाधन खपत।

पूरक पढ़ता है:


24
मुझे लगता है कि REPEATABLE READ के लिए ऊपर एक गलती है: आप कहते हैं कि मौजूदा पंक्तियों को न तो हटाया जा सकता है और न ही बदला जा सकता है, लेकिन मुझे लगता है कि इन्हें हटाया या बदला जा सकता है क्योंकि बार-बार पढ़ने योग्य "स्नैपशॉट" पढ़ता है न कि वास्तविक डेटा। डॉक्स dev.mysql.com/doc/refman/5.0/en/… से : "सभी संगत समान लेन-देन को पढ़ते हैं, जो पहले पढ़े गए स्नैपशॉट को पढ़ता है।"
डेरेक लिट्ज

2
@ डेरेक लिज़्ट मैं सही कह रहा हूँ कि आप कह रहे हैं: लेन-देन होने के दौरान डेटा CAN / MAY को तीसरे पक्ष से बदला जा सकता है, लेकिन रीड अभी भी 'पुराने' मूल डेटा को देखेगा जैसे कि परिवर्तन नहीं हुआ था जगह (स्नैपशॉट)।
प्रोग्रामर

5
@मकई के डंठल। हां, फैंटम रीड डिलीट (या इंसर्ट) से हो सकता है। हां, प्रेत रीड बार-बार पढ़ने योग्य अलगाव (आवेषण से) में हो सकता है। नहीं, प्रेत हटाए गए पाठों को बार-बार पढ़े जाने वाले अलगाव में नहीं हो सकता है। झसे आज़माओ। मैं जो कह रहा हूं, वह आपके द्वारा उद्धृत किए गए प्रलेखन द्वारा विरोधाभास नहीं है।
एंडीब्रोवन

4
@ कॉर्नस्टालक्स एनपी। मैंने केवल इसका उल्लेख किया क्योंकि मैं खुद 100% सुनिश्चित नहीं था और यह सुनिश्चित करने के लिए कि कौन सही था, गहरा-गोता लगाना था! और मैं भविष्य के पाठकों को गुमराह नहीं करना चाहता था। टिप्पणियों को फिर से रखना, संभवतः सुझाव के अनुसार रखना सबसे अच्छा है। मुझे यकीन है कि ठीक विस्तार के उस स्तर में रुचि रखने वाले किसी और व्यक्ति को सभी टिप्पणियों को पढ़ने के लिए विशेष रूप से पर्याप्त होगा !!
एंडीब्रोवन

12
आपकी टिप्पणियों को नहीं हटाने के लिए धन्यवाद। चर्चा अधिक बिंदुओं को जोड़ने में मदद करती है।
जोश

68

बार-बार पढ़ने योग्य

डेटाबेस की स्थिति को लेनदेन की शुरुआत से बनाए रखा जाता है। यदि आप session1 में एक मान प्राप्त करते हैं, तो सत्र 2 में उस मान को अपडेट करें, सत्र 1 में इसे फिर से प्राप्त करने से वही परिणाम वापस आ जाएंगे। पढ़े जाने योग्य हैं।

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Aaron

कमिटेड पढ़ें

लेन-देन के संदर्भ में, आप हमेशा सबसे हाल ही में प्रतिबद्ध मूल्य प्राप्त करेंगे। यदि आप session1 में मान प्राप्त करते हैं, तो इसे session2 में अपडेट करें, फिर इसे session1again में पुनः प्राप्त करें, आपको सत्र 2 में संशोधित मूल्य मिल जाएगा। यह अंतिम प्रतिबद्ध पंक्ति को पढ़ता है।

session1> BEGIN;
session1> SELECT firstname FROM names WHERE id = 7;
Aaron

session2> BEGIN;
session2> SELECT firstname FROM names WHERE id = 7;
Aaron
session2> UPDATE names SET firstname = 'Bob' WHERE id = 7;
session2> SELECT firstname FROM names WHERE id = 7;
Bob
session2> COMMIT;

session1> SELECT firstname FROM names WHERE id = 7;
Bob

समझ में आता है?


मैंने SQL Server 2008 में "सेट आइसोलेशन स्तर रिपीटेबल रीड" के साथ रिपीटेबल पढ़ने की कोशिश की। दो sql क्वेरी विंडो बनाई। लेकिन काम नहीं किया। क्यों?
आदित्य बोकाडे

1
दूसरा सत्र 1 अभी भी हारून को क्यों पढ़ेगा? क्या सत्र 2 का लेन-देन समाप्त और शुरू नहीं हुआ है? मैं इस पुराने को जानता हूं, लेकिन शायद कोई कुछ प्रकाश डाल सकता है।
सन्नी चिल्ड्स

9
मुझे लगता है कि रिपीटेबल रीड पहले सत्र के लिए प्रतिबद्ध होने तक दूसरे सत्र को रोक देगा। तो उदाहरण गलत है।
निगॉन

4
दोहराने योग्य पढ़ने के मामले में, जब सत्र 1 पंक्ति को पढ़ता है, तो यह एक साझा लॉक डालता है, जो किसी भी विशेष लॉक (सत्र 2 के लिए) को अपडेट के लिए अनुमति नहीं देगा, इसलिए डेटा को अपडेट नहीं किया जा सकता है।
ताहिर

मुझे लगता है कि जब दो लेन
user2488286

23

इस धागे के लिए मेरे पढ़ने और समझ के अनुसार बस उत्तर और @ रेमस-रसानु उत्तर इस सरल परिदृश्य पर आधारित है:

दो प्रक्रियाएं ए और बी हैं। प्रक्रिया बी तालिका एक्स पढ़ रही है। प्रक्रिया एक तालिका में लिख रही है। प्रक्रिया बी फिर से तालिका एक्स पढ़ रही है।

  • ReadUncommitted : Process B, प्रोसेस A से अनकम्युटेड डेटा को पढ़ सकता है और यह B लेखन पर आधारित विभिन्न पंक्तियों को देख सकता है। कोई ताला नहीं
  • ReadCommitted : प्रोसेस बी प्रक्रिया ए से केवल प्रतिबद्ध डेटा पढ़ सकता है और यह केवल बी लेखन के आधार पर विभिन्न पंक्तियों को देख सकता है। क्या हम इसे सिंपल लॉक कह सकते हैं?
  • RepableRead : Process B जो प्रक्रिया A कर रहा है, वही डेटा (पंक्तियाँ) पढ़ेगा। लेकिन प्रक्रिया A अन्य पंक्तियों को बदल सकती है। पंक्तियों का स्तर ब्लॉक
  • अनुक्रमिक : प्रक्रिया बी पहले की तरह ही पंक्तियों को पढ़ेगी और प्रक्रिया ए तालिका में पढ़ या लिख ​​नहीं सकती है। टेबल-स्तरीय ब्लॉक
  • स्नैपशॉट : हर प्रक्रिया की अपनी एक प्रति होती है और वे इस पर काम कर रहे होते हैं। हर एक का अपना दृष्टिकोण है

15

पुराना प्रश्न जिसका पहले से ही स्वीकृत उत्तर है, लेकिन मैं इन दो अलगाव स्तरों के बारे में सोचना पसंद करता हूं कि वे SQL सर्वर में लॉकिंग व्यवहार को कैसे बदलते हैं। यह उन लोगों के लिए मददगार हो सकता है जो मेरे जैसे गतिरोध को डिबग कर रहे हैं।

पढ़ें (डिफ़ॉल्ट)

साझा ताले को SELECT में लिया जाता है और तब SELECT स्टेटमेंट पूरा होने पर जारी किया जाता है । यह इस प्रकार है कि सिस्टम यह गारंटी दे सकता है कि बिना डेटा के गंदे रीड्स नहीं हैं। आपके लेनदेन के पूर्ण होने और आपके लेनदेन के पूर्ण होने से पहले अन्य लेनदेन अभी भी अंतर्निहित पंक्तियों को बदल सकते हैं।

दोहराए गए पढ़ें

साझा ताले को SELECT में लिया जाता है और फिर लेनदेन पूर्ण होने के बाद ही जारी किया जाता है । यह इस तरह से है कि सिस्टम यह गारंटी दे सकता है कि आपके द्वारा पढ़ा गया मान लेन-देन के दौरान नहीं बदलेगा (क्योंकि वे लेनदेन समाप्त होने तक बंद रहते हैं)।


13

सरल आरेखों के साथ इस संदेह को समझाने की कोशिश की जा रही है।

पढ़ें प्रतिबद्ध: यहाँ इस अलगाव स्तर में, लेन-देन T1, लेन-देन T2 द्वारा प्रतिबद्ध X के अद्यतन मूल्य को पढ़ेगा।

कमिटेड पढ़ें

बार-बार पढ़ने योग्य: इस अलगाव स्तर में, लेन-देन T1 लेनदेन T2 द्वारा किए गए परिवर्तनों पर विचार नहीं करेगा।

यहां छवि विवरण दर्ज करें


1

मुझे लगता है कि यह चित्र भी उपयोगी हो सकता है, यह मुझे एक संदर्भ के रूप में मदद करता है जब मैं अलगाव के स्तर के बीच के अंतर को जल्दी से याद रखना चाहता हूं ( यूट्यूब पर kudvenkat के लिए धन्यवाद )

यहां छवि विवरण दर्ज करें


0

कृपया ध्यान दें कि, repeatable में एक टपल करने के लिए repeatable पढ़ने का संबंध है, लेकिन पूरे मेज पर नहीं। एएनएससी अलगाव के स्तर में, प्रेत पढ़ा विसंगति हो सकती है, जिसका मतलब है कि एक तालिका उसी के साथ पढ़ें जहां खंड दो बार अलग-अलग वापसी कर सकता है विभिन्न परिणाम सेट। वास्तव में, यह दोहराने योग्य नहीं है


-1

प्रारंभिक स्वीकृत समाधान पर मेरा अवलोकन।

RR (डिफ़ॉल्ट mysql) के तहत - यदि कोई tx खुला है और एक SELECT निकाल दिया गया है, तो दूसरा tx पिछले REx परिणाम सेट होने तक संबंधित किसी भी पंक्ति को हटा नहीं सकता है जब तक कि पिछला tx प्रतिबद्ध नहीं होता है (वास्तव में नया tx में स्टेटमेंट केवल लटका होगा) , हालांकि अगला tx बिना किसी परेशानी के तालिका से सभी पंक्तियों को हटा सकता है । Btw, पिछले tx में एक अगला READ अभी भी पुराने डेटा को तब तक देखेगा जब तक वह प्रतिबद्ध नहीं होता।


2
आप उत्तरदाता को सूचित करने के लिए टिप्पणी अनुभाग में रखना चाह सकते हैं। इस तरह वह आपकी टिप्पणियों का जवाब देने और आवश्यकता पड़ने पर सुधार करने में सक्षम हो जाएगा।
RBT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.