AUTO_INCREMENT und last_insert_id() sicher?

AUTO_INCREMENT und last_insert_id() sicher?

am 06.05.2005 20:30:10 von Georg Howen

Hallo,

ich habe in dem PHP-Buch von Schlossnagle ein DB-Beispiel gefunden, was mich
etwas stutzen lässt (ansonsten geniales Buch).

Szenario:

Es gibt eine Tabelle mit einer Spalte (id) als AUTO_INCREMENT.
Es erfolgt ein INSERT-Befehl mit Inhalt der Felder ausser ID.
Direkt im Anschluss wird über last_insert_id() der Wert von id ausgelesen
(und einem Objekt als sein id-Wert zugewiesen)

Jetzt frage ich mich was passiert, wenn nach dem INSERT von Benutzer1 ein
INSERT von Benutzer2 erfolgt, bevor Benutzer1 über last_insert_id() seine id
ausgelesen hat.

Eigentlich müssten doch dann Benutzer1 und Benutzer2 den selben ID-Wert
zurückbekommen (was nicht wünschenswert wäre), oder? Falls ja, gibt es da
ein besseres Design?

Danke für Erleuchtungen,

Georg

Re: AUTO_INCREMENT und last_insert_id() sicher?

am 06.05.2005 21:19:07 von Matthias Esken

On Fri, 6 May 2005 20:30:10 +0200, Georg Howen wrote:

> Es gibt eine Tabelle mit einer Spalte (id) als AUTO_INCREMENT.
> Es erfolgt ein INSERT-Befehl mit Inhalt der Felder ausser ID.
> Direkt im Anschluss wird über last_insert_id() der Wert von id ausgelesen
> (und einem Objekt als sein id-Wert zugewiesen)
>
> Jetzt frage ich mich was passiert, wenn nach dem INSERT von Benutzer1 ein
> INSERT von Benutzer2 erfolgt, bevor Benutzer1 über last_insert_id() seine id
> ausgelesen hat.
>
> Eigentlich müssten doch dann Benutzer1 und Benutzer2 den selben ID-Wert
> zurückbekommen (was nicht wünschenswert wäre), oder?

Nein, das müssten sie nicht und das bekommen sie natürlich auch nicht.
Durch jedes INSERT wird der Wert des Autoincrement-Feldes hochgezählt. Das
Auslesen durch einen Client spielt dort überhaupt keine Rolle.

Falls du dir jetzt Sorgen machst, ob man denn dann via last_insert_id()
überhaupt immer die richtige ID zum eigenen Datensatz bekommt, so kann ich
dich auch da beruhigen. Diese Funktion bezieht sich auf die jeweilige
Verbindung zur DB. Benutzer 1 bekommt also garantiert nicht die ID, die das
Autoincrement des Statements von Benutzer 2 erzeugt hat, sondern seine
eigene.

Gruß,
Matthias

Re: AUTO_INCREMENT und last_insert_id() sicher?

am 06.05.2005 21:32:38 von Marian Heddesheimer

On Fri, 6 May 2005 20:30:10 +0200, Georg Howen wrote:

>Jetzt frage ich mich was passiert, wenn nach dem INSERT von Benutzer1 ein
>INSERT von Benutzer2 erfolgt, bevor Benutzer1 über last_insert_id() seine id
>ausgelesen hat.

ein Beispiel, wie du sowas selbst testen kannst, findest du hier:

http://www.heddesheimer.de/coaching/mysql_multiuser.html

Gruß

Marian

--
Online Lernen (auch fuer Blinde geeignet): HTML, PHP, MySQL, Word
http://www.lernpilot.de/wbt/