2011-05-08 16 views
11

Ho riflettuto su questo per un po '.MySQL e PDO: Potrebbe il PDO :: lastInsertId fallire teoricamente?

Si consideri un'applicazione Web di enormi proporzioni, dove, diciamo, milioni di query SQL vengono eseguite ogni secondo.

corro il mio codice:

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

Poi subito dopo, voglio andare a prendere l'auto incrementato ID di questa ultima query:

$id = $db->lastInsertId(); 

È possibile per lastInsertId di fallire, vale a dire prendere l'ID di una query di inserimento SQL eseguita tra i miei due blocchi di codice?

secondario:

Se può fallire, quale sarebbe il modo migliore per collegare questo possibile fuga di notizie?

Sarebbe più sicuro creare un'altra query SQL per recuperare l'ID corretto dal database, solo per essere sicuri?

risposta

18

Sarà sempre sicuro, a condizione che l'implementazione PDO non stia facendo qualcosa di veramente ossuto. Quanto segue è dalle informazioni MySQL su last_insert_id:

L'ID che è stato generato viene mantenuto nel server per ogni connessione. Ciò significa che il valore restituito dalla funzione a un determinato client è il primo valore AUTO_INCREMENT generato per la più recente istruzione che influisce su una colonna AUTO_INCREMENT da quel client. Questo valore non può essere influenzato da altri client, anche se generano valori AUTO_INCREMENT propri. Questo comportamento garantisce che ciascun client possa recuperare il proprio ID senza preoccuparsi dell'attività di altri client e senza necessità di blocchi o transazioni.

+0

OK, posto su. Grazie! – Mattis

4

No. lastInsertId è per connessione e non richiede una richiesta al server - mysql lo rimanda sempre nel suo pacchetto di risposta.

Quindi, se il metodo di esecuzione non genera un'eccezione, è garantito il valore corretto in lastInsertId.

Non fornirà mai l'ID dell'inserto di altro, a meno che la query non sia riuscita per qualche motivo (ad esempio sintassi non valida), nel qual caso potrebbe fornire l'ID di inserimento da quello precedente sulla stessa connessione. Ma non di chiunque altro.

+1

Impressionante Mark, quindi mi sento al sicuro :) – Mattis