Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
am 16.09.2004 14:23:57 von Stefan Herbert Tiran
Hallo Leute,
ich bin gerade dabei, ein Eingabeskript für eine MySQL Datenbank auf
PHP-Basis zu schreiben. Direkt nach dem Eintrag eines Datensatzes in der
Haupttabelle möchte ich dem Benutzer die Möglichkeit geben, einen oder
mehrere Einträge in einer Beziehungstabelle zu erstellen. Dafür benötige
ich den Primärschlüssels des neuen Eintrages in die Haupttabelle, der
mit auto_increment erstellt wurde.
Ganz spontan und intuitiv würde ich dieses Problem lösen, in dem ich den
Eintrag einfach mit einem SELECT neu suche, es kann dank UNIQUE jeder
Eintrag ohnedies nur einmal vorkommen.
Beim Nachschlagen in FAQ-Listen und Manuals bin ich jedoch auf eine
Funktion Namens mysql_insert_id() gestoßen, die eigentlich so ziemlich
genau das macht, was ich will. Ich traue mich allerdings nicht, diese
Funktion zu verwenden, weil ich Angst habe, dass in der Zeit zwischen
dem INSERT-Query und dem Abfragen der ID jemand anderes einen INSERT
macht und dadurch der von mysql_insert_id() zurückgelieferte Wert falsch
ist.
Ist meine Sorge berechtigt oder habe ich da etwas noch nicht verstanden?
Falls letzteres würde ich mich freuen, wenn mir das jemand erklärte.
mit freundlichen Grüßen und bestem Dank im Voraus
Stefan Herbert Tiran
Re: Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
am 16.09.2004 14:44:11 von Rene Rathmann
hallo
Stefan Herbert Tiran wrote:
> Beim Nachschlagen in FAQ-Listen und Manuals bin ich jedoch auf eine
> Funktion Namens mysql_insert_id() gestoßen, die eigentlich so ziemlich
> genau das macht, was ich will. Ich traue mich allerdings nicht, diese
> Funktion zu verwenden, weil ich Angst habe, dass in der Zeit zwischen
> dem INSERT-Query und dem Abfragen der ID jemand anderes einen INSERT
> macht und dadurch der von mysql_insert_id() zurückgelieferte Wert falsch
> ist.
Der befehl hatt einen Parameter die Verbindungs-Kennung damit wird
bestimmt welcher letzter insert gemeint ist. Mit dieser
Verbindungs-Kennung werden noch einige andere Werte gespeichert z.b. die
verwendete Datenbank.
mysql_insert_id ( [resource Verbindungs-Kennung]) [1]
Du brauchst keine Verbindungs-Kennung angeben wenn du nur eine
Verbindung zu eine Datenbank hast.
Ich hoffe das hilft.
mfg Rene
[1] http://de2.php.net/manual/de/function.mysql-insert-id.php
--
Wieso Simple wenn es Auch Einfach geht ?
Re: Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
am 16.09.2004 15:12:57 von Daniel Jaenecke
Stefan Herbert Tiran wrote:
> Beim Nachschlagen in FAQ-Listen und Manuals bin ich jedoch auf eine
> Funktion Namens mysql_insert_id() gestoßen, die eigentlich so ziemlich
> genau das macht, was ich will. Ich traue mich allerdings nicht, diese
> Funktion zu verwenden, weil ich Angst habe, dass in der Zeit zwischen
> dem INSERT-Query und dem Abfragen der ID jemand anderes einen INSERT
> macht und dadurch der von mysql_insert_id() zurückgelieferte Wert falsch
> ist.
3.6.9 Using AUTO_INCREMENT
| You can retrieve the most recent AUTO_INCREMENT value with the
| LAST_INSERT_ID() SQL function or the mysql_insert_id() C API function.
| These functions are connection-specific, so their return value is not
| affected by another connection also doing inserts.
> Ist meine Sorge berechtigt oder habe ich da etwas noch nicht verstanden?
nein - ja
Gruß
-dj-
--
Anything worth doing is worth doing for money.
[Ferengi Rules Of Acquisicion #13]
Re: Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
am 16.09.2004 16:32:32 von Markus Malkusch
Stefan Herbert Tiran:
> Ganz spontan und intuitiv würde ich dieses Problem lösen, in dem ich den
> Eintrag einfach mit einem SELECT neu suche
Ohne zu sperren gibt's hier tatsächlich Race Conditions.
> Ist meine Sorge berechtigt oder habe ich da etwas noch nicht verstanden?
,---
|
| The value of mysql_insert_id() is affected only by statements issued
| within the current client connection
`---
--
- Whoisabfrage
Re: Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
am 17.09.2004 08:52:20 von Stefan Herbert Tiran
Hallo Leute,
als erstes einmal danke ich Rene, Daniel und Markus für die Antwort.
Jetzt kann ich unbesorgt mysql_insert_id() verwenden.
Was mich aber noch interessiert:
Markus Malkusch schrieb:
>>Ganz spontan und intuitiv würde ich dieses Problem lösen, in dem ich den
>>Eintrag einfach mit einem SELECT neu suche
>
>
> Ohne zu sperren gibt's hier tatsächlich Race Conditions.
So aus dem Zusammenhang gerissen sehe ich das auch so. Ich habe jedoch
extra erwähnt, dass ich einen Index UNIQUE über alle anderen Spalten als
den Primärschlüssel angelegt habe. Rein theoretisch müsste da doch die
von mir vorgeschlagene Methode auch funktionieren, oder?
mit freundlichen Grüßen
Stefan Herbert Tiran
Re: Angst vor race-conditions in Zusammenhang mit mysql_insert_id()
am 17.09.2004 10:38:34 von Markus Malkusch
Stefan Herbert Tiran:
> Ich habe jedoch
> extra erwähnt, dass ich einen Index UNIQUE über alle anderen Spalten als
> den Primärschlüssel angelegt habe. Rein theoretisch müsste da doch die
> von mir vorgeschlagene Methode auch funktionieren, oder?
Stimmt. Ich habe beim ersten Lesen gedacht dass sich der UNIQUE Schlüssel
auf die auto_increment id bezieht, was ja vollkommener Blödsinn wäre.
--
- Whoisabfrage