2012-05-04 15 views
7

मैंने conn.setAutoCommit (true) का उपयोग करके COMMIT अन्य का उपयोग करके कुछ प्रोग्रामर को देखा है; लेनदेन को खत्म करने या वापस रोल करने के लिए तो दूसरे के बजाय एक का उपयोग करने के क्या फायदे हैं? मुख्य अंतर कहां है?COMMIT या conn.setAutoCommit (true)

conn.setAutoCommit(true); 

से अधिक
statement.executeQuery(query); 
statement.commit(); 
+1

वे विभिन्न उद्देश्यों के लिए अलग-अलग उपकरण हैं। एक दूसरे की तुलना में "बेहतर" या "अधिक सही" नहीं है। – Affe

+0

नेटवर्क पर प्रतिबद्ध क्लाइंट का उपयोग करते समय नए रिकॉर्ड नहीं देख पा रहे थे, फिर भी वे अपने परिणाम को रीफ्रेश कर रहे थे, लेकिन जब ऑटोोकॉमीट सत्य पर सेट किया गया, तो यह ठीक काम कर रहा है, यह मेरी समस्या है। – Motasem

+0

यह प्रश्न दो विधियों के बारे में गलतफहमी दिखाते हैं। जैसे अफफी ने कहा, वे किसी भी तरह से एक ही बात नहीं कर रहे हैं। जब ऑटो प्रतिबद्ध मोड सक्षम होता है, तो प्रत्येक कथन स्वचालित रूप से प्रतिबद्ध होता है। जब यह सक्षम हो जाता है, तो लेन-देन पूरी तरह से शुरू होते हैं, और प्रतिबद्ध() को वास्तव में उन्हें प्रतिबद्ध करने के लिए बुलाया जाना चाहिए (भले ही लेनदेन स्पष्ट रूप से प्रारंभ नहीं किया गया हो)। प्रतिबद्ध() एक खुले लेनदेन करता है। setAutoCommit यह निर्धारित करता है कि लेनदेन पूरी तरह से या स्पष्ट रूप से शुरू किया गया है या नहीं। – Corbin

उत्तर

9

आप सामान्य उपयोग Connection.commit() में होना चाहिए और लेनदेन करने के लिए Connection.setAutoCommit(true) नहीं, जब तक कि आप ऑटोकॉमिट के 'लेनदेन प्रति कथन' मॉडल में लेनदेन का उपयोग करने से स्विच नहीं करना चाहते हैं।

उस ने कहा, लेनदेन में Connection.setAutoCommit(true) पर कॉलिंग लेनदेन करेगा (यदि ड्राइवर जेडीबीसी 4.1 स्पेक की धारा 10.1.1 के साथ शिकायत है)। लेकिन आपको वास्तव में ऐसा करना चाहिए यदि आप उसके बाद ऑटोकॉमिट में रहना चाहते हैं, क्योंकि कनेक्शन पर ऑटोकॉमिट को सक्षम/अक्षम करने से कनेक्शन पर अधिक ओवरहेड हो सकता है (उदाहरण के लिए क्योंकि इसे लेनदेन प्रबंधकों के बीच स्विच करने की आवश्यकता है, अतिरिक्त चेक करें , आदि)।

आपको Connection.commit() का भी उपयोग करना चाहिए और देशी SQL कमांड COMMIT का उपयोग नहीं करना चाहिए।

नोट:: जैसा कि कनेक्शन के दस्तावेज में विस्तृत जानकारी दी जब एक कनेक्शन को विन्यस्त, JDBC अनुप्रयोगों appropritate कनेक्शन विधि ऐसे setAutoCommit या setTransactionIsolation के रूप में इस्तेमाल करना चाहिए। जेडीबीसी विधि उपलब्ध होने पर अनुप्रयोगों को कनेक्शन की कॉन्फ़िगरेशन को बदलने के लिए सीधे SQL आदेशों का आह्वान नहीं करना चाहिए।

बात यह है कि commit() और SetAutoCommit(boolean) तरह आदेशों ResultSets बंद करने और बंद करने या Statements रीसेट करने की तरह वापस जमीन में अधिक काम कर सकते हैं, है। SQL कमांड COMMIT का उपयोग करके इसे बाईपास कर दिया जाएगा और संभावित रूप से आपके ड्राइवर/कनेक्शन को गलत स्थिति में लाया जाएगा।

+0

यह वह नहीं है जो उपयोगकर्ता पूछ रहा था। – Corbin

+0

@ कोर्बिन मैंने अपना जवाब अपडेट किया। मैंने पाठ में 'COMMIT' पर बहुत अधिक ध्यान केंद्रित किया। –

4

conn.setAutoCommit(); के उपयोग कनेक्शन पर लागू होता है और आप एक ही लेन-देन में एक्स प्रश्नों निष्पादित या के रूप में प्रति execute

एक ही लेन-देन का उपयोग करने के संभावना प्रदान करता है एपीआई वर्णन करता है:

void setAutoCommit(boolean autoCommit) 
        throws SQLException 

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

एक सरल मामले के लिए:

conn.setAutoCommit(false); 
statement.executeQuery(query); 
statement.commit(); 

ही होगा के रूप में:

conn.setAutoCommit(true); 
statement.executeQuery(query); 
+0

यदि आपको conn.setAutoCommit (true) है तो आपको एक ही विधि –

+0

में 2 प्रविष्टियों/अपडेट/डिलीट स्टेटमेंट का उपयोग करते समय भी अंतर दिखाना चाहिए; तो मैं सहेज नहीं पाएगा क्योंकि एसीआईडी ​​यहां प्राथमिकता है, लेकिन क्या मैं conn.setAutoCommit (false) का उपयोग कर सकता हूं; statement.executeQuery (क्वेरी); statement.commit(); conn.setAutoCommit (सत्य); और इस कैस में प्रतिबिंब क्या होगा? – Motasem

+0

@ मोटासेम लेकिन 'conn.setAutoCommit (सत्य); statement.executeQuery (क्वेरी); 'conn.setAutoCommit (false) के समान ही होगा; statement.executeQuery (क्वेरी); statement.commit(); 'जांचें कि क्या आपका' कथन। com() 'सफलता के साथ बुलाया जा रहा है और कुछ 'SQLException' – MrJames

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