2009-09-11 9 views
8

मेरे पास एक प्रश्न है जो लगातार कई उपयोगकर्ताओं द्वारा निष्पादित किया जा सकता है। मुझे डर है कि अगर मैं db_last_insert_id कमांड चलाता हूं, तो कुछ उपयोगकर्ताओं को समवर्तीकरण के कारण अंतिम प्रविष्टि आईडी नहीं मिल सकती है। लेकिन इसके अनुसार: http://api.drupal.org/api/function/db_last_insert_id/6, यह बताता है:एसक्यूएल अंतिम डालने। क्या यह वास्तव में थ्रेडसेफ है?

अंतिम डालने आईडी लौटाता है। यह फ़ंक्शन थ्रेड सुरक्षित है।

मेरा सवाल है, यह धागा सुरक्षित कैसे है? कोड केवल है:

<?php 
    function db_last_insert_id($table, $field) { 
    return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')")); 
    } 
?> 

मुझे तालिकाओं को लॉक करने या कुछ भी नहीं देखने के बारे में कुछ भी नहीं दिख रहा है?

database.mysql-common.inc में
function db_last_insert_id($table, $field) { 
    return db_result(db_query('SELECT LAST_INSERT_ID()')); 
} 


और LAST_INSERT_ID() पर निर्भर करता है:

उत्तर

19

MySQL का उपयोग करना (के रूप में आप अपने प्रश्न पर टैग के साथ इंगित करने के लिए लग रहे हैं), समारोह db_last_insert_id() इस तरह से परिभाषित किया गया है कनेक्शन (उद्धरण, जोर मेरा):

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

तो, मैं कहना चाहता हूँ कि इस के लिए MySQL ;-)


परिभाषा काफी ठीक आपके तैनात है वास्तव में PostgreSQL के लिए इस्तेमाल किया जाता है:

function db_last_insert_id($table, $field) { 
    return db_result(db_query("SELECT CURRVAL('{". db_escape_table($table) ."}_". db_escape_table($field) ."_seq')")); 
} 

database.pgsql.inc

में


pgsql manual on sequences(उद्धरण; जोर मील ne):

currval

वापसी मान सबसे हाल ही में इस क्रम वर्तमान सत्र में के लिए nextval द्वारा प्राप्त।(कोई त्रुटि बताया जाता है अगर nextval इस दृश्य के लिए कहा जाता है इस सत्र में कभी नहीं रहा।) सूचना है कि क्योंकि इस है एक सत्र-स्थानीय मूल्य, यह लौटने एक उम्मीद के मुताबिक जवाब जाए या अन्य सत्र निष्पादित नहीं देता है वर्तमान सत्र के बाद से था।

तो, मुझे लगता है कि PostGreSQL के लिए यह भी ठीक है।

+1

धन्यवाद। काश मैं आपको दस यूपीएस दे सकता हूं। – coderama

+2

आपका स्वागत है :-) हुहू ^^ आपको 10 अन्य प्रश्न पूछना होगा, जिसके लिए मुझे जवाब पता है :- डी –

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