2011-05-08 11 views
11

मैं थोड़ी देर के लिए इस पर विचार कर रहा हूं।MySQL और पीडीओ: पीडीओ :: lastInsertId सैद्धांतिक रूप से असफल हो सकता है?

भारी अनुपात के वेब एप्लिकेशन पर विचार करें, कहें, लाखों एसक्यूएल प्रश्न हर सेकेंड में किए जाते हैं। के ठीक बाद

$q = $db->prepare('INSERT INTO Table 
       (First,Second,Third,Fourth) 
      VALUES (?,?,?,?)'); 
$q->execute(array($first,$second,$third,$fourth)); 

, मैं ऑटो लाने के लिए चाहते हैं यह पिछले क्वेरी की आईडी वृद्धि:

मैं अपने कोड चलाने

$id = $db->lastInsertId(); 

, lastInsertId विफल करने के लिए क्या यह संभव है यानी लाने को मेरे दो कोड ब्लॉक के बीच के बीच निष्पादित किया गया था कुछ SQL सम्मिलित क्वेरी की आईडी?

माध्यमिक:

इसे विफल कर सकते हैं, क्या सबसे अच्छा तरीका यह संभव रिसाव प्लग करने के लिए हो सकता है?

क्या यह सुनिश्चित करने के लिए डेटाबेस से उचित आईडी लाने के लिए एक और SQL क्वेरी बनाना सुरक्षित होगा?

उत्तर

18

यह हमेशा सुरक्षित रहेगा बशर्ते कि पीडीओ कार्यान्वयन वास्तव में कुछ हड्डी के नेतृत्व में नहीं कर रहा है। निम्नलिखित last_insert_id पर 0S:

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

+0

ठीक है, पर स्पॉट करें। धन्यवाद! – Mattis

4

नहीं अंतिम InsertId प्रति कनेक्शन है, और सर्वर के लिए अनुरोध की आवश्यकता नहीं है - mysql हमेशा इसे अपने प्रतिक्रिया पैकेट में भेजता है।

तो यदि निष्पादन विधि अपवाद नहीं फेंकती है, तो आपको अंतिम InsertId में सही मान होने की गारंटी है।

यह आपको किसी अन्य कारण की प्रविष्टि आईडी कभी नहीं देगा, जब तक कि आपकी क्वेरी किसी कारण से विफल न हो (उदा। अमान्य वाक्यविन्यास) जिस स्थिति में यह आपको उसी कनेक्शन पर पिछले एक से सम्मिलित आईडी दे सकता है। लेकिन किसी और का नहीं।

+1

बहुत बढ़िया मार्क, तो मैं सुरक्षित महसूस करता हूं :) – Mattis