Problem mit Laufzeiten von Aggregat zu Insert > doppelte

MySQL, PostgreSQL, SQLite
f-c0d3
Posts: 17
Joined: 2004-03-08 17:15

Problem mit Laufzeiten von Aggregat zu Insert > doppelte

Post by f-c0d3 » 2005-01-05 12:55

Hallo,
ich hab folgendes Problem:

Ich hab ne Site in der werden für einen Client bei einem Besuch Einträge in der Datenbank gemacht.
Die Tabelle enthält eine Spalte "ID"... Sobald der Benutzer die Site besucht mach ich ein SELECT MAX(ID)+10 FROM ... und weise danach dem Eintrag der geschrieben wird die ID, die ich aus der Aggregat-Funktion bekommen hab, zu.

Leider ist es jetzt aber (so unwarscheinlich das auch klingen mag) schon ein paar mal vorgekommen das anscheinen wirklich gleichzeitig 2 Benutzer auf die Site gekommen sind und die Laufzeit zwischen der Aggregat-Funktion und dem Insert-Statement so lang (millisekunden) war das beide Benutzer die gleiche ID bekommen haben...

Gibt es einen Weg sowas zu umgehen?

Thx 4 Help

jürgen2372
Posts: 17
Joined: 2004-08-31 23:00

Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte

Post by jürgen2372 » 2005-01-05 13:41

Haste das Insert und das angegebene Select als ein Query?

INSERT INTO xxxxx SELECT MAX(ID)+10 FROM ....

f-c0d3
Posts: 17
Joined: 2004-03-08 17:15

Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte

Post by f-c0d3 » 2005-01-05 14:10

Ne hab ich nicht als ein Query...
Ist das die einzigste Lösung um doppelte ID´s zu vermeiden?

von der Struktur her sieht das so aus

SELECT MAX(ID)+1...

bischen script in php

INSERT

djholliday
Posts: 26
Joined: 2004-11-23 16:18
Location: Nürnberg

Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte

Post by djholliday » 2005-01-05 14:35

Aber genau da liegt die Lücke.
In der Zeit, in der dein "bischen script in PHP" abgearbeitet wird, liefert jedes Select-Statement die gleiche Zahl.
Fass doch mal INSERT und SELECT zusammen, dann sollte es auch funktionieren.

Gruss,
Andreas

djholliday
Posts: 26
Joined: 2004-11-23 16:18
Location: Nürnberg

Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte

Post by djholliday » 2005-01-05 15:02

Falls deine ID vom Typ auto_increment ist könntest du auch mit LAST_INSERT() arbeiten

INSERT INTO xxxxx(ID, col2, col3) VALUES( LAST_INSERT_ID() + 1, 'Hello', 'World');

http://dev.mysql.com/doc/mysql/de/index.html

Gruss,
Andreas

f-c0d3
Posts: 17
Joined: 2004-03-08 17:15

Re: Problem mit Laufzeiten von Aggregat zu Insert > doppelte

Post by f-c0d3 » 2005-01-05 16:12

ich bin mir sicher das das alles lösungen sind mit denen man das problem umgehen könnte... allerdings verwende ich für die erstellung der einträge in der datenbank einen eigenen SQL-Wrapper... indem lässt sich das nicht so einfach implementieren ohen die komplette anwendung an vielen stellen neu zu schreiben...

allerdings habe ich einen weg gefunden das problem zu umgehen indem man einfach eine eigene tabelle erstellt indem die aktuellen höchsten id´s gepsichert werden und bei einer agregat-funktion in einer while-schleife solange hochzählt bis die id gültig ist... php see mysql_affected_rows...


sollte das prinzip auch nicht funzen werde ich den thrad noch mal weiterführen...

aber jetzt erst mal entwickeln und testen...


danke für die beiträge