Page 1 of 1

Get_lock

Posted: 2007-03-13 19:50
by phoenix-style
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?

Re: Get_lock

Posted: 2007-03-13 20:48
by Joe User

Re: Get_lock

Posted: 2007-03-13 20:55
by phoenix-style
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.

Re: Get_lock

Posted: 2007-03-13 21:34
by Joe User
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...

Re: Get_lock

Posted: 2007-03-15 05:27
by isotopp
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.

Re: Get_lock

Posted: 2007-03-15 14:58
by kase
Stichworte InnoDB+Transaktionen, eventuell ein SELECT FOR UPDATE

Re: Get_lock

Posted: 2007-03-17 09:27
by isotopp
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.

Re: Get_lock

Posted: 2007-03-17 17:09
by kase
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 :)