2009-09-09 12 views
8

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

जब मैंने अंततः लेनदेन बंद कर दिया, तो कोड चलाया और तालिका की जांच की, मैंने निम्नलिखित पर ध्यान दिया। लेन-देन को बंद किए बिना हर बार मैंने गलती से अपना कोड चलाया, जिसके परिणामस्वरूप वास्तविक पंक्तियां डाली नहीं गईं, फिर भी ऑटो-वृद्धि वृद्धि सरोगेट प्राथमिक कुंजी मान में वृद्धि हुई, ताकि मेरे पास एक अंतर हो (यानी आईडी फ़ील्ड मान के साथ कोई पंक्ति नहीं है 751 से 762)।

क्या यह अपेक्षित या मानक व्यवहार है? क्या यह डेटाबेस के आधार पर भिन्न हो सकता है? और/या हाइबरनेट के अपने लेन-देन अमूर्तता पर कुछ संभावित प्रभाव पड़ता है?

+0

मुझे जवाब पता था, लेकिन यह अभी भी एक दिलचस्प सवाल है! – RichardOD

+1

आदर्श रूप से आपके आवेदन/डिज़ाइन को अनुक्रम में किसी भी अंतर से प्रभावित नहीं किया जाना चाहिए - आपको ऐसी परिस्थिति में खुद को कभी नहीं लेना चाहिए जहां यह वास्तव में महत्वपूर्ण है –

उत्तर

8

हां इसकी उम्मीद है।

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

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

6

यह बहुत अधिक अपेक्षित व्यवहार है। इसके साथ ही डीबी को प्रत्येक लेनदेन के लिए इंतजार करना होगा जिसने अगले डालने के लिए एक नई आईडी निर्दिष्ट करने से पहले पूरा करने के लिए एक रिकॉर्ड डाला है।

5

हां, यह व्यवहार की उम्मीद है। This documentation इसे बहुत अच्छी तरह से बताता है।

5.1.22 के साथ शुरुआत में, वास्तव में तीन अलग-अलग लॉक मोड हैं जो नियंत्रित करते हैं कि समवर्ती लेन-देन कैसे ऑटो-वृद्धि मूल्य प्राप्त करते हैं। लेकिन सभी तीन रोल-बैक लेनदेन के लिए अंतराल का कारण बनेंगे (लुढ़का हुआ लेनदेन द्वारा उपयोग किए जाने वाले ऑटो-वृद्धि मूल्यों को फेंक दिया जाएगा)।

0

डाटाबेस अनुक्रम बिना किसी अंतर के आईडी अनुक्रम की गारंटी नहीं दे रहे हैं। वे लेन-देन-स्वतंत्र होने के लिए डिज़ाइन किए गए हैं, केवल इस तरह से गैर-अवरुद्ध हो सकते हैं।

आप कोई अंतराल नहीं चाहते हैं, आपको लेनदेन को बढ़ाने के लिए अपनी खुद की संग्रहीत प्रक्रिया लिखनी होगी, लेकिन इस तरह के कोड अन्य लेनदेन को अवरुद्ध कर देंगे, इसलिए आपको सावधान रहना चाहिए।

आप SEQUENCE_TABLE से चुनें CURRVAL जहां टाइप = = YOUR_SEQ_NAME अद्यतन के लिए; अद्यतन SEQUENCE_TABLE सेट CURRVAL =: INCREMENTED_CURRVAL जहां टाइप = = YOUR_SEQ।

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