Vraag MySQL en PDO: kan PDO :: lastInsertId theoretisch falen?


Ik heb hier een tijdje over nagedacht.

Overweeg een webtoepassing van enorme proporties, waarbij, laten we zeggen, miljoenen SQL-query's elke seconde worden uitgevoerd.

Ik voer mijn code uit:

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

Onmiddellijk daarna wil ik de auto opgehoogde ID van deze laatste zoekopdracht ophalen:

$id = $db->lastInsertId();

Is het mogelijk dat lastInsertId faalt, dat wil zeggen, haal dan de ID van een SQL-invoegquery op die is uitgevoerd tussen mijn twee codeblokken?

Tweede:

Als het kan falen, wat is dan de beste manier om dit mogelijke lek te dichten?

Zou het veiliger zijn om nog een SQL-query te maken om de juiste ID uit de database op te halen, om het zeker te weten?


11
2018-05-08 23:45


oorsprong


antwoorden:


Het zal altijd veilig zijn, op voorwaarde dat de implementatie van de PDO niets echt botten doet. Het volgende is van de MySQL-informatie op last_insert_id:

De ID die is gegenereerd, wordt per verbinding bijgehouden in de server. Dit betekent dat de waarde die door de functie aan een bepaalde client wordt geretourneerd de eerste AUTO_INCREMENT-waarde is die is gegenereerd voor de meest recente instructie die van invloed is op een kolom AUTO_INCREMENT van die client. Deze waarde kan niet worden beïnvloed door andere clients, zelfs als ze zelf AUTO_INCREMENT-waarden genereren. Dit gedrag zorgt ervoor dat elke klant zijn eigen ID kan ophalen zonder zich zorgen te maken over de activiteit van andere klanten en zonder dat er sloten of transacties nodig zijn.


18
2018-05-08 23:49



Nee. LastInsertId is per-verbinding en vereist geen verzoek aan de server - mysql stuurt het altijd terug in zijn antwoordpakket.

Dus als de methode execute geen uitzondering genereert, dan bent u zeker van de juiste waarde in lastInsertId.

U krijgt nooit de invoeg-ID van iets anders, tenzij uw zoekopdracht om een ​​of andere reden is mislukt (bijvoorbeeld ongeldige syntaxis). In dat geval krijgt u mogelijk de invoeg-ID van de vorige op dezelfde verbinding. Maar niet die van iemand anders.


4
2018-05-09 06:48