2011-12-12 10 views
7

मुझे लगता है कि यह सच है, लेकिन मुझे इसकी पुष्टि करने के लिए वेब पर कुछ भी नहीं मिला है। मैं last_insert_id() का उपयोग कर autoincrement फ़ील्ड के लिए जेनरेट की गई पहली आईडी प्राप्त कर सकता हूं, लेकिन क्या मुझे लगता है कि अगले रिकॉर्ड में अनुक्रमिक आईडी होंगे? या कोई अन्य उपयोगकर्ता एक आईडी ले सकता है ताकि परिणामस्वरूप आईडी अनुक्रमिक न हों?क्या एक MySQL मल्टी-पंक्ति सम्मिलित अनुक्रमिक autoincrement आईडी को पकड़ता है?

उदाहरण: mytable (asdf, qwer) मान (1,2), (3,4), (5,6), ..., (10000,10001) में डालें;

यदि मायटेबल में एक ऑटोइनक्रिकमेंट कॉलम है, और यदि दो उपयोगकर्ता एक ही समय में यह कथन चलाते हैं, तो क्या कोई उपयोगकर्ता 10000 अनुक्रमिक आईडी, और अन्य उपयोगकर्ता अगले 10000 अनुक्रमिक आईडी ले जाएगा? सैकड़ों उपयोगकर्ताओं के लिए कैसे?

धन्यवाद।

+1

यह सच हो सकता है देखते हैं, लेकिन आप के रूप में जहाँ तक मुझे पता जैसी कोई आश्वासन दिया है। – Nanne

उत्तर

9

यह प्रयुक्त स्टोरेज इंजन पर निर्भर करता है। के बाद से एक मेज स्तरीय ताला डालने दौरान आयोजित किया जाता

  • MyISAM, डाला पंक्तियों की गारंटी देता है अनुक्रमिक आईडी है।
  • InnoDB: जब तक innodb_autoinc_lock_modeinterleaved (2) के लिए सेट है, डाला पंक्तियों अनुक्रमिक आईडी होगा। डिफ़ॉल्ट रूप से InnoDB 5.112 और traditional मोड से पहले consecutive मोड में चलता है।

innodb_autoinc_lock_mode विकल्प के बारे में अधिक के लिए, 13.6.4.3. AUTO_INCREMENT Handling in InnoDB

2

एक बहु-पंक्ति सम्मिलन केवल एक थोक ऑपरेशन है जो एक ही ऑपरेशन को बार-बार करता है। जब कोई सम्मिलित कथन निकाल दिया जाता है, तो यह एक ट्रिगर को सक्रिय करता है जो आईडी उत्पन्न करता है।

तो यदि डेटाबेस इंजन का उपयोग किया जाता है, तो इसके सभी कार्यों को क्रमिक तरीके से (कतार की तरह - पहले-पहले में बाहर) करता है, फिर हां, अनुक्रमिक आईडी पिछले आईडी की तुलना में एक वृद्धि होगी; यदि डेटा को बहु-थ्रेडेड तरीके से डाला जाता है जहां समानांतर में कथन निकाल दिए जाते हैं, तो नहीं, आईडी को "यादृच्छिक" पर दिया जाएगा।

मुझे किसी भी mysql इंजन से अवगत नहीं है जो इसकी गारंटी देता है, लेकिन फिर मैंने इस विशिष्ट विषय में अधिक शोध नहीं किया है।

4

यदि आप लॉक टैबलेट का उपयोग करते हैं, तो बैचों को क्रमिक आईडी प्राप्त करना चाहिए।

उदाहरण:

LOCK TABLES users WRITE; 
<BULK INSERT HERE> 
UNLOCK TABLES; 

यह एक ही समय में मेज पर लिखने से अधिक थ्रेड नहीं कर पाएगा।

+0

क्या मैं innodb इंजन के लिए 'LOCK टेबल ..' का उपयोग कर सकता हूं? – stack

+0

हां - लॉक टेबल इनो डीबी के साथ काम करता है - लॉकिंग दस्तावेज चेकआउट करें: https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html –

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