MySQL, PostgreSQL, SQLite
-
phoenix-style
- Posts: 30
- Joined: 2007-01-25 20:52
Post
by phoenix-style » 2007-03-13 19:50
Hi,
eine kurze Frage zu GET_LOCK. Hab das ganze mal getestet aber irgendwie scheint das bei mir nicht ganz zu klappen. Folgendes Szenario:
Ein User drückt z.B 2mal auf einen Button. Auf der folgeseite werden Einträge in die Datenbank getätigt. Natürlich soll der Eintrag nicht doppelt erscheinen. Im Script wird zwar abgefragt ob noch ein Eintrag möglich ist, aber wenn ein User 2mal schnell hintereinander auf den Button klickt, stört das das Script recht wenig. Lösung wäre also GET_LOCK.
Mein Ansatz war:
Code: Select all
$lock = mysql_query("SELECT GET_LOCK('test2', 10)");
if(!$lock) die(gettext('Error'));
....
Queries,Inserts,Updates
....
mysql_query("SELECT RELEASE_LOCK('test2')");
Da mysql_query ja nur die Ressource id zurückliefert dürfte die Prüfung darauf ja ausreichen. Jedoch wenn der User 2mal auf den Button drückt werden immer noch 2 Einträge gemacht.
Irgendwelche Anregungen?
-
Joe User
- Project Manager

- Posts: 11139
- Joined: 2003-02-27 01:00
- Location: Hamburg
Post
by Joe User » 2007-03-13 20:48
-
phoenix-style
- Posts: 30
- Joined: 2007-01-25 20:52
Post
by phoenix-style » 2007-03-13 20:55
meinst du auf die Idee bin ich nicht gekommen??
Das hilft mir auch nicht weiter.
und Lock Tables ist wieder ein anderes Thema.
Ich hätte gerne einen konkreten Ansatz wo das Problem liegt, da ich nach Stundenlangem testen und googeln immer noch nich weiter bin.
-
Joe User
- Project Manager

- Posts: 11139
- Joined: 2003-02-27 01:00
- Location: Hamburg
Post
by Joe User » 2007-03-13 21:34
Ohne vollständigen Beispielcode wird das Debuggen unter Umständen schwierig, zumal ich momentan einfach keine Zeit und Lust habe, die diesbezüglich eventuell existierenden MySQL und PHP Bugs abzuklappern...
-
isotopp
- Posts: 471
- Joined: 2003-08-21 10:21
- Location: Berlin
Post
by isotopp » 2007-03-15 05:27
pHoEnIx-sTyLe wrote:Jedoch wenn der User 2mal auf den Button drückt werden immer noch 2 Einträge gemacht.
Ja, aber jetzt werden die beiden Einträge NACHEINANDER gemacht.
-
kase
- Posts: 1031
- Joined: 2002-10-14 22:56
Post
by kase » 2007-03-15 14:58
Stichworte InnoDB+Transaktionen, eventuell ein SELECT FOR UPDATE
-
isotopp
- Posts: 471
- Joined: 2003-08-21 10:21
- Location: Berlin
Post
by isotopp » 2007-03-17 09:27
kase wrote:Stichworte InnoDB+Transaktionen, eventuell ein SELECT FOR UPDATE
Leute, ihr sitzt da einem fundamentalen Mißverständnis auf. Bei Locks (und auch bei Transaktionen) geht es nicht darum, Duplikate zu verhindern. Es geht darum, Dinge in eine Reihenfolge zu bringen. Es werden aber immer noch zwei Ereignisse passieren, nur daß sie sich logisch nicht mehr überschneiden.
-
kase
- Posts: 1031
- Joined: 2002-10-14 22:56
Post
by kase » 2007-03-17 17:09
Naja, pHoEnIx-sTyLe hat ja geschrieben, dass er vorher abfragt, ob er den Datensatz eintragen muss. Wenn er das Ganze nun in eine Transaktion packt, wird ihm das SELECT vom 2. Scriptaufruf das richtige Ergebnis liefern, und nicht zwischen das SELECT und das UPDATE des 1. Scriptaufrufs schieben. Natürlich bedeuten Transaktionen nur, dass man etwas in eine Reihenfolge bringt, aber in der richtigen Reihenfolge machen die 2 Scriptaufrufe eventuell etwas ganz anderes
