यह एक पुरानी सवाल है, लेकिन मैं इस मुद्दे पर एक अलग राय दे देना चाहता था।
प्रदर्शन
लेनदेन से प्रदर्शन भूमि के ऊपर संगामिति नियंत्रण तंत्र के साथ बदलता रहता है: सामान्य रूप से बहु संस्करण संगामिति नियंत्रण या ताला। अन्य उत्तरों में व्यक्त की गई चिंता लेनदेन को समाप्त करने की लागत से कम है, लेकिन मेरे अनुभव में सबसे बड़ा दर्द लंबे समय से चलने वाले लेनदेन है, जो प्रदर्शन की बाधाओं का कारण बन सकता है। उदाहरण के लिए, यदि डीबीएमएस लॉकिंग का उपयोग करता है, तो तालिका के कुछ हिस्सों को अपडेट नहीं किया जा सकता है जब तक उस तालिका को शामिल करने वाले लेनदेन को समाप्त नहीं किया जाता है। ओरेकल जैसे सिस्टम में अधिक निराशाजनक यह है कि डीडीएल ऑपरेशंस (ALTER TABLE
इत्यादि) को तब तक इंतजार करना पड़ता है जब तक कि उस तालिका का उपयोग करके सभी लेन-देन समाप्त नहीं हो जाते हैं, जिससे परेशानी का समय लगता है। तो अगर आप SELECT
एस का उपयोग कर रहे हैं तो अपने लेनदेन का कोई दंड नहीं है।
कन्वेंशनों
autocommit व्यवहार बंद स्थापित करने के साथ एक सूक्ष्म समस्या यह है कि आप डिफ़ॉल्ट से बदल रहे हैं, तो किसी और को अपने कोड के साथ काम कर यह उम्मीद नहीं की जा सकती है। यह वास्तव में आसान एक फ़ंक्शन के माध्यम से एक आकस्मिक पथ छोड़ने के लिए एक स्पष्ट commit
या rollback
के साथ समाप्त नहीं होता है, और इससे बाद में ज्ञात कार्यों में अप्रत्याशित व्यवहार हो सकता है। इसके विपरीत, मैंने देखा है कि डीबी-इंटरफेसिंग कोड का एक बड़ा हिस्सा प्रत्येक फंक्शन के भीतर एक ही कथन है, जिसके लिए ऑटोोकॉमिट व्यवहार बहुत उपयुक्त है। असल में मैंने जो बहु-कथन कार्यों का सामना किया है, उन्हें थोड़ा और एसक्यूएल के साथ एकल कथन के रूप में फिर से लिखा जा सकता है - जावा में लागू होने के लिए खराब अनुमान कमजोर हैं।
मेरे निजी पसंद, उचित अनुभव के आधार पर, के रूप में एक डेटाबेस के लिए कॉल करने के लिए किसी भी कार्य के लिए इस प्रकार है: ऑन-प्रतिबद्ध ऑटो
- के डिफ़ॉल्ट JDBC व्यवहार करने के लिए रखना;
- जब अपने कार्य एक से अधिक SQL विवरण भी शामिल है, प्रत्येक कार्य के शुरू में
setAutocommit(false)
की स्थापना और commit()
(या rollback()
यदि उपयुक्त हो) अंत में, और आदर्श catch
ब्लॉक में rollback()
को फोन करके एक स्पष्ट लेन-देन का उपयोग करें;
finally
ब्लॉक कि अपने JDBC- समारोह में कॉल लपेटता में setAutocommit(true)
डालकर डिफ़ॉल्ट लागू (जैसे PHP/पीडीओ के रूप में एपीआई के विपरीत, JDBC के बाद commit()
/rollback()
आप के लिए यह काम नहीं चलेगा);
- यदि आप अतिरिक्त रक्षात्मक महसूस कर रहे हैं, तो प्रत्येक कार्य की शुरुआत में
setAutocommit(true)
या setAutocommit(false)
की अपनी पसंद स्पष्ट रूप से सेट करें;
मैं लेनदेन शुरू करने और समाप्त होने के प्रदर्शन के मुद्दे से असहमत हूं। यह मेरा अनुभव कभी नहीं रहा है, बल्कि कई लंबे लेनदेन कई छोटे लोगों की तुलना में अधिक बाधाओं का कारण बनता है। क्या आपके पास इसके विपरीत कोई सबूत है? – beldaz