2010-06-23 12 views
26

एक लेनदेन में चयन बयान संलग्न करने का क्या मतलब है? मुझे लगता है कि चयन कथन डेटाबेस से डेटा प्राप्त करते हैं, उन्हें कुछ रोलबैक करने का मौका नहीं है, क्योंकि आप डेटा को बदल नहीं सकते हैं। तो, क्या यह कहने के लिए कि हमें लेनदेन में कभी भी चुनिंदा बयानों की आवश्यकता नहीं है? क्या मैं सही हू?लेनदेन में चयन बयान संलग्न करने का क्या मतलब है?

धन्यवाद।

उत्तर

31

आप सही हैं: मानक isolation level, read committed पर, आपको लेनदेन में चयन विवरण लपेटने की आवश्यकता नहीं है। चयन कथन गंदे पढ़ने से संरक्षित किया जाएगा चाहे आप उन्हें लेनदेन में लपेटें या नहीं।

connection 1:       connection 2: 

             begin transaction 
             update user set name = 'Bill' where id = 1 
select name from users where id = 1 
             rollback transaction 

चयन बयान लुढ़का वापस अद्यतन नहीं पढ़ा होगा: यह कोई बात नहीं है कि वे एक सौदे में लिपटे नहीं कर रहे हैं।

आप repeatable reads की जरूरत है, एक डिफ़ॉल्ट लेनदेन में तो लपेटकर चयन में मदद नहीं करता:

connection 1:       connection 2: 

begin transaction 
select name from users where id = 1 
             update user set name = 'Bill' where id = 1 
select name from users where id = 1 
commit transaction 

begin और commit बयानों यहाँ मदद नहीं करेगा: दूसरे select पुराने नाम पढ़ सकते हैं, या यह नया नाम पढ़ सकता है।

हालांकि, अगर आप एक उच्च अलगाव स्तर पर चलाते हैं, serializable या repeatable read की तरह, समूह गैर repeatable से रक्षा की जाएगी पढ़ता है:

connection 1:       connection 2: 

set transaction isolation level 
    repeatable read 
begin transaction 
select name from users where id = 1 
             update user set name = 'Bill' where id = 1 
select name from users where id = 1    | 
commit transaction        | 
               |--> executed here 

इस परिदृश्य में, update पहले लेनदेन जब तक अवरुद्ध कर देगा पूरा है।

उच्च अलगाव स्तर शायद ही कभी उपयोग किया जाता है क्योंकि वे एक ही समय में डेटाबेस में काम कर सकते हैं जो लोगों की संख्या को कम करते हैं। उच्चतम स्तर पर, serializable, एक रिपोर्टिंग क्वेरी किसी भी अद्यतन गतिविधि को रोकती है।

+0

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

+0

@Pacerier: दोहराने योग्य-पढ़ने का कहना है कि यदि आप दो बार पढ़ते हैं, तो दूसरा पठन एक ही परिणाम देगा। ओरेकल या PostgeSQL के विपरीत, SQL सर्वर पुराने मानों को चारों ओर नहीं रखता है। आप इस व्यवहार को ['SET READ_COMMITTED_SNAPSHOT ON'] (http://msdn.microsoft.com/en-us/library/ms345124.aspx) के साथ बदल सकते हैं। – Andomar

+0

हम्म, यह अजीब है, MySQL पर डिफ़ॉल्ट लगता है। तो एसक्यूएल सर्वर के लिए, 'read read_committed_snapshot चालू' चलाने के बाद, क्या यह कहना सही है कि "अपडेट" ** ** ** ब्लॉक नहीं होगा? – Pacerier

7

आप इस लेनदेन के दौरान अन्य अपडेट/आवेषण कर रहे हैं। यदि डेटाबेस का उपयोग करने वाला आपका कोड एक पुन: प्रयोज्य फैशन में लिखा गया है तो हो सकता है कि लेनदेन में केवल एक ही चीज हो रही हो।

आपके चयन बयान लेनदेन की अवधि के लिए संगत होना चाहिए, साथ ही अन्य लेनदेन में होने वाले डेटा परिवर्तनों के अनुरूप होना चाहिए। गंदे पठन को रोकने के लिए आप किसी अन्य प्रकार के isolation level को सेट करना चाहते हैं (दूसरे लेनदेन में असामान्य परिवर्तन पढ़ना) या प्रेत पढ़ता है (दूसरे लेनदेन में किए गए परिवर्तनों को पढ़ना)।

कहने की जरूरत नहीं है, आप लेनदेन का उपयोग करके बेहतर सेवा प्रदान करेंगे।

4

सं।

एक लेनदेन आपको डेटाबेस का एक सतत दृश्य देता है।

यदि आप चाहते हैं कि आप उन्हें दोहराते समय समान परिणाम लौटाने के लिए चुनते हैं, तो एक लेनदेन यह प्रदान कर सकता है।

4

आप डेटा बदल नहीं सकते हैं, लेकिन कुछ अन्य डेटाबेस कनेक्शन हो सकता है।

1

यदि आप सुनिश्चित हैं कि जो भी हो रहा है वह एक चयन है, तो उसे लेनदेन में होने की आवश्यकता नहीं है। क्या आप 100% सुनिश्चित हैं कि अब और हमेशा के लिए यह सिर्फ एक चयन होने जा रहा है?

5

एक एकल चयन कथन शुरू करने के लिए परमाणु है - इसे लेनदेन में संलग्न करना अनावश्यक है। यदि कई चयन कथन हैं, तो आप गारंटी देते हैं कि उनमें से किसी भी को प्रभावित करने तक कोई भी कुछ भी प्रभावित नहीं करता है।

2

के साथ लेनदेन का उपयोग करने का एक और कारण एक का चयन करें:

यह वर्तमान लेन-देन में भाग लेने के चयन संभव कुछ बिंदु पर आप अन्य तरीकों कि एक सौदे में भाग ले रहे से अपने चुनिंदा विधि आह्वान करने के लिए चाहते हो सकता है और आप चाहते हैं । यदि आपके पास एक सतत डिज़ाइन है जहां लेनदेन में सभी डेटाबेस क्रियाएं की जाती हैं तो किसी भी विधि के कॉलर्स जानते हैं कि यह उनके लेन-देन में भाग लेगा।

एक छोटी सी आगे की विकास लागत के लिए, यह कुछ बदलावों से बचने में मदद कर सकता है जब बाद में आवश्यकताओं को बदलने या नई आवश्यकताओं को जोड़ने के दौरान लेन-देन करने की कोशिश कर रहा है।

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