Get_lock

MySQL, PostgreSQL, SQLite
phoenix-style
Posts: 30
Joined: 2007-01-25 20:52

Get_lock

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?

User avatar
Joe User
Project Manager
Project Manager
Posts: 11614
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Get_lock

Post by Joe User » 2007-03-13 20:48

PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

phoenix-style
Posts: 30
Joined: 2007-01-25 20:52

Re: Get_lock

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.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11614
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Get_lock

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...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
isotopp
RSAC
Posts: 482
Joined: 2003-08-21 10:21
Location: Berlin

Re: Get_lock

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
RSAC
Posts: 1041
Joined: 2002-10-14 22:56

Re: Get_lock

Post by kase » 2007-03-15 14:58

Stichworte InnoDB+Transaktionen, eventuell ein SELECT FOR UPDATE

User avatar
isotopp
RSAC
Posts: 482
Joined: 2003-08-21 10:21
Location: Berlin

Re: Get_lock

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
RSAC
Posts: 1041
Joined: 2002-10-14 22:56

Re: Get_lock

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 :)