2009-12-29 8 views
30

क्या डिफ़ॉल्ट रीड कमेटेड अलगाव स्तर किसी भी तरह से लेनदेन में नहीं होने वाले लेनदेन के अंदर चयन कथन अलग-अलग कार्य करता है?क्या लेन-देन के अंदर एक चुनिंदा बयान और उसके बाहर के किसी भी विवरण के बीच कोई अंतर है

मैं एमएसएसक्यूएल का उपयोग कर रहा हूं।

उत्तर

54

हाँ, लेन-देन के अंदर एक कि लेनदेन में अन्य पिछले सम्मिलित करें/अद्यतन/हटाने बयानों द्वारा किए गए परिवर्तनों को देख सकते हैं, लेन-देन नहीं कर सकते हैं बाहर एक का चयन करें बयान ....

सब यदि आप पूछ रहे हैं अलगाव स्तर क्या करता है, उसके बारे में समझते हैं - सभी लेन-देन में सभी चयन वक्तव्य (हे, सभी प्रकार के सभी बयान), - हैं। एक लेनदेन में स्पष्ट रूप से एक है और जो स्वयं खड़ा है, उसके बीच एकमात्र अंतर यह है कि अकेले खड़े होने वाला व्यक्ति इसे निष्पादित करने से पहले लेनदेन शुरू कर देता है, और इसे निष्पादित करने के तुरंत बाद वापस या रोल करता है,

जबकि एक लेनदेन में स्पष्ट रूप से है, (क्योंकि इसमें एक प्रारंभिक लेनदेन कथन है) उस चुनिंदा वक्तव्य के पहले या उसके बाद, उसी लेनदेन के भीतर अन्य कथन (सम्मिलित/अपडेट/हटाए गए, जो भी हो) हो सकते हैं।

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

अतिरिक्त: निम्नलिखित SQL सर्वर के लिए है, लेकिन सभी डेटाबेस एक ही तरीके से काम करना चाहिए। SQL सर्वर में क्वेरी प्रोसेसर हमेशा 3 लेनदेन मोडों में से एक है, ऑटोकॉमिट, लागू, या स्पष्ट

AutoCommit SQL सर्वर डेटाबेस इंजन का डिफ़ॉल्ट लेनदेन प्रबंधन मोड है। .. प्रत्येक ट्रांजैक्ट-एसक्यूएल कथन पूर्ण होने पर वापस या लुढ़का जाता है। ... यदि कोई कथन सफलतापूर्वक पूर्ण हो जाता है, तो यह प्रतिबद्ध होता है; अगर यह किसी भी त्रुटि का सामना करता है, तो इसे वापस लुढ़काया जाता है। यह डिफ़ॉल्ट है, और टिप्पणियों में @ एलेक्स के सवाल का जवाब है।

Implicit Transaction मोड में

, "... एसक्यूएल सर्वर डेटाबेस इंजन स्वचालित रूप से एक नई लेन-देन के बाद वर्तमान लेन-देन के लिए प्रतिबद्ध या वापस लुढ़का है शुरू होता है आप किसी लेन-देन के शुरू होने से चित्रित करने के लिए कुछ भी नहीं;। आप केवल करने या रोल प्रत्येक लेनदेन को वापस करें। लागू लेनदेन मोड लेनदेन की निरंतर श्रृंखला उत्पन्न करता है ... "ध्यान दें कि इटालिकाइज्ड स्निपेट प्रत्येक लेनदेन के लिए है, चाहे वह एकल या एकाधिक कथन लेनदेन हो।

इंजन Explicit Transaction मोड में रखा गया है जब आप स्पष्ट रूप से BEGIN TRANSACTION स्टेटमेंट के साथ लेनदेन शुरू करते हैं। फिर, जब तक आप स्पष्ट रूप से लेनदेन को समाप्त नहीं करते हैं (COMMIT या ROLLBACK) या यदि विफलता होती है तो इंजन को समाप्त करने और रोलबैक का कारण बनने तक प्रत्येक कथन को उस लेनदेन के भीतर निष्पादित किया जाता है।

+1

मुझे लगता है कि वह पूछ रहा है कि क्या "चयन करें ..." और "लेनदेन शुरू करें; चुनें ...; लेनदेन रोकें;" – tster

+0

बहुत अच्छी तरह से कहा! –

+0

ग्रेट उत्तर। मैं इस जानकारी की तलाश कर रहा था – Davita

2

पढ़ा गया अलगाव स्तर लिखे गए रिकॉर्ड के बारे में है। इसका चयन करने के लिए कुछ भी नहीं है कि यह चयन कथन एक लेनदेन में है या नहीं (उसी लेनदेन के दौरान लिखी गई चीज़ों को छोड़कर)।

5

हां, इसमें कुछ अंतर है। MySQL के लिए, डेटाबेस वास्तव में आपकी पहली क्वेरी तक स्नैपशॉट से प्रारंभ नहीं होता है। इसलिए, यह महत्वपूर्ण नहीं है, लेकिन लेनदेन के भीतर पहला बयान। अगर मैं निम्न कार्य करें:

#Session 1 
begin; select * from table; 

#Session 2 
delete * from table; #implicit autocommit 

#Session 1 
select * from table; 

तो मैं एक ही बात सत्र में दोनों बार (सूचना है कि तालिका में था इससे पहले कि मैं इसे नष्ट कर दिया) प्राप्त होंगे। जब मैं सत्र का लेनदेन (प्रतिबद्ध, प्रारंभ, या रोलबैक) समाप्त करता हूं और उस सत्र से फिर से जांचता हूं, तो तालिका खाली दिखाई देगी।

+1

MySQL InnoDB के लिए, आप बिल्कुल सही हैं - इनो डीबी रीड कमेटेड अलगाव मोड की गारंटी लगातार पढ़ने की गारंटी देता है। हालांकि, सामान्य मामले में, आपको गैर-दोहराने योग्य पढ़ने का सामना करना पड़ सकता है, जो इस मामले में अन्य मामलों (ऑटोकॉमिट बनाम लंबित लेनदेन) को अन्य लेनदेन द्वारा किए गए संशोधनों को देखने में सक्षम होने के कारण उबाल सकता है, बशर्ते परिवर्तन किए जाएं। –

3

यदि आपका डेटाबेस (या mysql में, आपके चयन कथन में उपयोग की जाने वाली सभी तालिकाओं का अंतर्निहित स्टोरेज इंजन) लेनदेन है, तो इसे "लेनदेन के बाहर" निष्पादित करने का कोई तरीका नहीं है।

शायद आपका मतलब है "इसे ऑटोोकॉमिट मोड में चलाएं", लेकिन यह "लेनदेन नहीं" जैसा नहीं है। बाद के मामले में, यह अभी भी एक लेनदेन में चलता है, यह सिर्फ इतना है कि लेनदेन समाप्त होने के तुरंत बाद लेनदेन समाप्त हो जाता है।

तो, दोनों मामलों में, दौड़ के दौरान, एक ही चयन कथन अन्य लेनदेन से पढ़ें कमांड स्तर पर अलग किया जाएगा।

अब आपके रीड कमांड लेनदेन अलगाव स्तर के लिए इसका क्या अर्थ है: शायद आश्चर्य की बात है, इतना नहीं।

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

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