Re: Doppler vermeiden

Re: Doppler vermeiden

am 11.09.2007 02:15:51 von Michael Fesser

..oO(Daniel Schmidt)

>ich schreibe eine laufende Nummer in eine MySQL-DB, indem ich die letzte
>Nummer in der DB abrufe, dieser eine dazuaddiere und wieder in die DB
>schreibe. Das Ganze sieht momentan so aus:

Blöde Idee, Stichwort: race condition.

>Nun passiert es bei vielen Zugriffen das einige gleichzeitig zugreifen
>und dieselbe id bekommen.

Logisch. Das Abfragen und Erhöhren der ID muß atomar, d.h. in einer
einzigen Operation erfolgen, was bei Dir aber nicht der Fall ist.

>Nun meine Frage, lässt sich das vermeiden, dass man z.B. nur einen
>Zugriff macht bzw. den Vorgang für die Abfrage und das schreiben sperrt,
>z.B.:
>
>
>mysql_tab_fuer_fremde_zugriffe_sperren();
>... mysql_query("SELECT ...
>... mysql_query("INSERT INTO ...
>mysql_tab_sperren_aufheben();

Das funktioniert nicht. Was aber funktioniert, ist z.B. eine Spalte mit
AUTO_INCREMENT. Spricht was dagegen bei Deiner DB? Brauchst Du die ID
_vor_ dem Einfügen eines Datensatzes oder erst hinterher?

Ist hier aber OT, daher Xpost & Fup2 dclpd

Micha

Re: Doppler vermeiden

am 11.09.2007 03:05:03 von Daniel Schmidt

> Das funktioniert nicht. Was aber funktioniert, ist z.B. eine Spalte mit
> AUTO_INCREMENT. Spricht was dagegen bei Deiner DB? Brauchst Du die ID
> _vor_ dem Einfügen eines Datensatzes oder erst hinterher?

ja das ist dann wohl die Lösung, nun habe ich schon Werte in der DB, wie
war das gleich, muß ich da was an der Datenbank ändern? Spalte id als "key"?


Gruß Daniel

Re: Doppler vermeiden

am 11.09.2007 03:05:41 von Daniel Schmidt

wie lautet der korrekte INSERT Befehl?


Gruß Daniel

Re: Doppler vermeiden

am 11.09.2007 08:24:58 von bruening

Daniel Schmidt schrieb:
> ja das ist dann wohl die Lösung, nun habe ich schon Werte in der DB, wie
> war das gleich, muß ich da was an der Datenbank ändern? Spalte id als
> "key"?

Wenn du eine Spalte "ID" hinzufügst, sie als "primary key" und
"auto_increment" (beides einfach im phpMyAdmin anklicken) markierst,
dann erhalten auch alle vorhandenen Datensätze nachträglich eine
eindeutige ID.

btw: http://learn.to/quote



Gruß,
Habbo

Re: Doppler vermeiden

am 11.09.2007 08:45:35 von Christoph Herrmann

Daniel Schmidt schrieb:
> wie lautet der korrekte INSERT Befehl?

Erklärung und Beispiele:
http://dev.mysql.com/doc/refman/5.1/de/example-auto-incremen t.html

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/

Re: Doppler vermeiden

am 11.09.2007 09:43:15 von Joerg Behrens

Daniel Schmidt schrieb:
>> Das funktioniert nicht. Was aber funktioniert, ist z.B. eine Spalte mi=
t
>> AUTO_INCREMENT. Spricht was dagegen bei Deiner DB? Brauchst Du die ID
>> _vor_ dem Einfügen eines Datensatzes oder erst hinterher?
>=20
> ja das ist dann wohl die Lösung, nun habe ich schon Werte in der DB, =
wie=20
> war das gleich, muß ich da was an der Datenbank ändern? Spalte id a=
ls=20
> "key"?

Anzumerken sei nur das deine Ursprungsidee ansich gut war nur die=20
Ausfuehrung lies zu Wünschen übrig.

Die bessere Lösung waere gewesen eine Tabelle nur fuer die Sequenz zu=20
machen welche dann immer kurz gelockt wird, ausgelesen, erhoeht und=20
wieder freigegeben.

Abstraktionslayer welche mehr als eine Datenbank ansprechen koennen=20
machen es i.d.R auch so. Die AUTO_INCREMENT Funktionalitaet welche MySQL =

da bietet ist einmalig gibts fuer andere RDBMS "so" nicht (Da heist es=20
dann Sequenz/Trigger).

Gruss
Joerg

--=20
TakeNet GmbH, Geschaeftsfuehrer Wolfgang Meier
97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Straße 20 Fax: +49 931 903-3025
HRB Wuerzburg 6940 http://www.takenet.de

Re: Doppler vermeiden

am 11.09.2007 09:55:43 von Christoph Herrmann

Joerg Behrens schrieb:
> Abstraktionslayer welche mehr als eine Datenbank ansprechen koennen
> machen es i.d.R auch so. Die AUTO_INCREMENT Funktionalitaet welche MySQL
> da bietet ist einmalig gibts fuer andere RDBMS "so" nicht (Da heist es
> dann Sequenz/Trigger).

DB2 kann das auch. *anmerk* ;)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/

Re: Doppler vermeiden

am 11.09.2007 15:47:15 von Michael Fesser

..oO(Joerg Behrens)

>Die bessere Lösung waere gewesen eine Tabelle nur fuer die Sequenz zu
>machen welche dann immer kurz gelockt wird, ausgelesen, erhoeht und
>wieder freigegeben.

Auch eine Möglichkeit. Allerdings braucht man die Tabelle nicht zu
sperren. Das Erhöhen und Auslesen läßt sich in MySQL auch anders
erledigen:

UPDATE sequences
SET value = LAST_INSERT_ID(value + 1)
WHERE name = 'seqName';

Und dann hinterher im Script einfach per mysql_insert_id() oder
PDO->lastInsertId() die neue ID abfragen.

Micha