2008-10-13 8 views
20

हमारे कंपनी में उपयोग किए जाने वाले इन-हाउस एप्लिकेशन फ्रेमवर्क में प्रत्येक SQL क्वेरी को लेन-देन में रखना आवश्यक है, भले ही मुझे पता है कि कोई भी आदेश डेटाबेस में परिवर्तन नहीं करेगा। सत्र के अंत में, कनेक्शन बंद करने से पहले, मैं लेनदेन को इसे ठीक से बंद करने के लिए प्रतिबद्ध करता हूं। मुझे आश्चर्य है कि अगर मैं इसे वापस घुमाता हूं तो विशेष रूप से गति के मामले में कोई विशेष अंतर होता है।क्या लेन-देन में केवल प्रतिबद्धता और रोलबैक के बीच कोई अंतर है?

कृपया ध्यान दें कि मैं ओरेकल का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि अन्य डेटाबेस समान व्यवहार करते हैं। इसके अलावा, मैं लेनदेन शुरू करने की आवश्यकता के बारे में कुछ भी नहीं कर सकता, कोडबेस का वह हिस्सा मेरे हाथों से बाहर है।

उत्तर

12

डेटाबेस अक्सर पहले से ही एक छवि पत्रिका (लेनदेन से पहले क्या था) या बाद के चित्र पत्रिका (लेनदेन पूरा होने पर यह क्या होगा।) यदि यह पहले से छवि रखता है, तो यह होना चाहिए रोलबैक पर बहाल यदि यह बाद की छवि रखता है, तो उसे प्रतिबद्धता की स्थिति में डेटा को प्रतिस्थापित करना होता है।

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

यहां तक ​​कि एक प्रश्न-केवल लेनदेन के लिए, मैं शर्त लगाने के इच्छुक हूं ओरेकल के रोलबैक क्षेत्रों में कुछ लेन-देन रिकॉर्ड-रखरखाव है। मुझे संदेह है कि रोलबैक को ओरेकल के हिस्से पर कुछ काम करने की आवश्यकता होती है इससे पहले कि यह निर्धारित करता है कि वास्तव में वापस रोल करने के लिए कुछ भी नहीं है। और मुझे लगता है कि यह आपके लेनदेन के साथ तुल्यकालिक है। रोलबैक पूरा होने तक आप वास्तव में किसी भी ताले को रिलीज़ नहीं कर सकते हैं। [हाँ, मुझे पता है कि आप अपने लेनदेन में किसी का भी उपयोग नहीं कर रहे हैं, लेकिन लॉकिंग मुद्दा यह है कि मुझे लगता है कि रोलबैक को पूरी तरह से रिलीज़ किया जाना चाहिए, फिर सभी ताले जारी किए जा सकते हैं, फिर आपका रोलबैक समाप्त हो गया है।]

ऑन दूसरी ओर, प्रतिबद्धता अपेक्षित परिणाम कम या कम है, और मुझे संदेह है कि रोलबैक क्षेत्र को छोड़ना थोड़ा तेज हो सकता है। आपने कोई लेनदेन प्रविष्टियां नहीं बनाई हैं, इसलिए डीबी लेखक कभी भी जांचने और खोजने के लिए जागृत नहीं होगा कि ऐसा करने के लिए कुछ भी नहीं था।

मैं यह भी उम्मीद करता हूं कि प्रतिबद्धता तेजी से हो सकती है, अंतर भिन्न होंगे। इतना मामूली, कि आप उन्हें एक साथ-साथ तुलना में भी मापने में सक्षम नहीं हो सकते हैं।

+5

मैं इसे ऑरैकल के तरीके के विवरण के रूप में नहीं पहचानता। यह एक सामान्य विवरण की तरह लगता है जिसे ओरेकल पर लागू किया गया है। ओरेकल के कामों को कैसे हेलिक होने की संभावना है, इस पर अनुमान लगाया जाता है। –

+0

ओरेकल पत्रिका को "रेडो लॉग फ़ाइल" कहते हैं। यह रोलबैक सेगमेंट को "अंडो टेबल्स स्पेस" कहते हैं। क्या आप जानते हैं कि कौन तेज़ है? Commit या रोलबैक? –

+0

यदि ऐसा करने के लिए कोई काम नहीं है तो लगभग निश्चित रूप से कोई अंतर नहीं है। ओरेकल को तेजी से प्रतिबद्ध करने के लिए अनुकूलित किया गया है - केवल यह आवश्यक है कि प्रतिबद्ध रिकॉर्ड को फिर से लॉग बफर में लिखा जाए और बफर फ्लश किया गया हो (10 जी + में एसिंक्रोनस प्रतिबद्ध को छोड़कर)। एक रोलबैक अधिक काम है। –

0

चूंकि आपने कोई डीएमएल नहीं किया है, मुझे संदेह है कि ओरेकल में कॉममिट और रोलबैक के बीच कोई अंतर नहीं होगा। किसी भी तरह से करने के लिए कुछ भी नहीं है।

4

आम तौर पर एक COMMIT रोलबैक से बहुत तेज है, लेकिन जिस स्थिति में आपने कुछ भी नहीं किया है, वे प्रभावी रूप से समान हैं।

8

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

हालांकि, यह ध्यान देने योग्य है कि एक सत्र के बीच एक अंतर है जो एक लेनदेन के संदर्भ में प्रश्नों का एक गुच्छा करता है और एक सत्र जो लेनदेन की श्रृंखला के संदर्भ में समान प्रश्न करता है।

यदि कोई ग्राहक लेनदेन शुरू करता है, तो कोई क्वेरी करता है, एक COMMITOR रोलबैक करता है, फिर दूसरा लेनदेन शुरू करता है और दूसरी क्वेरी करता है, इस बात की कोई गारंटी नहीं है कि दूसरी क्वेरी उसी डेटाबेस स्थिति को पहली क्वेरी के रूप में देखेगी। कभी-कभी, डेटा के एक सतत दृश्य को बनाए रखना सार का है। कभी-कभी, डेटा का अधिक वर्तमान दृश्य प्राप्त करना सार का होता है। यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।

मुझे पता है, ओपी, इस सवाल से नहीं पूछा था। लेकिन कुछ पाठक इसे अपने दिमाग के पीछे पूछ रहे हैं।

3

प्रलेखन कहा गया है कि:

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

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110

यदि आप चाहते हैं ओ तो आप के रूप में अच्छी एक है कि कुछ नहीं कर के रूप में ही है क्या कर सकते हैं एक या अन्य करने के लिए चुनते हैं, और बस इसे करते हैं।

+0

यह वास्तव में ग्राहक पर निर्भर करता है। sqlplus, यह एक निहित प्रतिबद्धता है। दूसरों को यह नहीं हो सकता है। यदि नेटवर्क कनेक्शन टूट गया है (उदाहरण के लिए, क्लाइंट बस "चला जाता है"), तो यह एक रोलबैक है। –

+0

मुझे यकीन नहीं है कि यह एप्लिकेशन पर निर्भर करता है, मुझे शायद "सुंदर डिस्कनेक्ट" कहा जाना चाहिए, लेकिन दस्तावेज़ कहते हैं कि "एक आवेदन के सामान्य समाप्ति के बाद एक निहित अनुरोध होता है ..." http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/transact।एचटीएम # सीएनसीपीटी 1119 –

+0

वास्तव में, मुझे एक बेहतर संदर्भ मिला और मेरी पोस्टिंग संपादित की गई। धन्यवाद। –

1

ठीक है, हमें ध्यान रखना चाहिए कि ओरेकल में एक चयन क्या करता है। दो तरीके हैं। डिफ़ॉल्ट रूप से एक चयन डेटा लौटाता है क्योंकि उस डेटा को उस समय देखा गया था जब SELECT कथन निष्पादित करना शुरू कर दिया गया था (यह रीड कमेटेड अलगाव मोड, डिफ़ॉल्ट लेनदेन मोड में डिफ़ॉल्ट व्यवहार है)। तो अगर चयन जारी किए जाने के बाद एक अद्यतन/INSERT निष्पादित किया गया था जो परिणाम सेट में दिखाई नहीं देगा।

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

तो, कम से कम कभी-कभी लेनदेन में SELECT को निष्पादित करना आवश्यक है।

0

मुझे लगता है कि एक कमिट अधिक कुशल होगा; आमतौर पर आप उम्मीद करते हैं कि अधिकांश डीबी लेनदेन किए जाएंगे; तो आपको लगता है कि डीबी इस मामले के लिए अनुकूलित करता है (रोलबैक के लिए अधिक कुशल होने का प्रयास करने के विपरीत)।

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