Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3772[/thread]

LOCK für mysql?



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Froschpopo
 2007-02-02 14:47
#35158 #35158
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich betreibe ein Webformular. Nun will ich verhindern, dass durch zu schnelles Klicken auf einen Submit-button ein Datensatz versehendlich doppelt angelegt wird.

Meine bisherige Technik:

SELECT count(*) FROM users WHERE....
INSERT INTO users....

Das scheint jedoch kein sicherer Schutz gegen Doppel-Inserts zu sein.

Hat jemand von Euch eine Idee? LOCK bzw UNLOCK kommt für mich nicht in Frage, da ja hier nur ein thread gelockt wird und beim doppel-klick ja zwei threads gestartet werden.
Solche Probleme hatte ich bei meiner Textdatei damals nicht ;)

Es wäre ja auch blöd, wenn ich damit jedesmal die ganze tabelle sperren würde, dann könnte ich ja gleich mit Textdateien weitermachen.

Ich möchte gerne Server-Sessions (Web) verwalten. Das habe ich bisher auf CSV-Basis gemacht.\n\n

<!--EDIT|Froschpopo|1170420642-->
pq
 2007-02-02 14:55
#35159 #35159
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
du hast mehrere möglichkeiten, aber es kommt darauf an, was genau du unterbinden willst.

- unique keys - so bricht mysql ab, wenn der key schon existiert (also bspw. username)
- session - du überprüfst, ob der user schon auf insert geklickt hat
- transaktion - vor dem select startest du eine transaktion und beendest sie nach dem insert
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Froschpopo
 2007-02-02 15:02
#35160 #35160
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
UNIQUE ging mir auch schon durch den Kopf. Aber diese Möglichkeit würde ja verhindern, dass sich der User einloggen wenn er sich beim letzten Besuch nicht ausgeloggt hat und sein Datensatz noch in der Session-Tabelle existiert. Das wäre blöd.

Zu 2.: Um User-Vorgänge zu überprüfen brauche ich ja die Session-Tabelle. Aber wenn sich die User mehrfach einloggen können indem sie ganz schnell den Submit-Button klicken, ist das ja nicht möglich.

3.: Was meinst du mit Transaktion?
nepos
 2007-02-02 16:10
#35161 #35161
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Naja, eine Session läuft ja irgendwann auch mal ab. Du kannst prüfen, ob eine alte noch gültige da ist und nur wenn nicht eine neue anlegen. Den UNIQUE-Key würde ich trotzdem reinmachen, damit bleibt die Datenbank auf jeden Fall sauber...

Was eine Transaktion ist, kannst du hier nachlesen.
Froschpopo
 2007-02-02 16:59
#35162 #35162
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
habs jetzt so gemacht:

DELETE FROM users WHERE username = 'froschpopo'
INSERT INTO users (username) VALUES (?)
nepos
 2007-02-02 17:34
#35163 #35163
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, dann kannst du auch gleich REPLACE benutzen...
Froschpopo
 2007-02-02 17:37
#35164 #35164
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
soviel ich weiss, beschränkt sich REPLACE aber nur auf den Primärschlüssel! Der Primärschlüssel enthält bei mir die SessionID. Username ist ein UNIQUE
pq
 2007-02-02 17:58
#35165 #35165
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,02.02.2007, 14:02]3.: Was meinst du mit Transaktion?[/quote]
wenn ich mich recht erinnere, hast du schonmal danach gefragt, und
das ist einige zeit her. transaktion sollte jedem, der Datenbanken
benutzt, ein begriff sein.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2007-02-02 18:00
#35166 #35166
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,02.02.2007, 14:02]UNIQUE ging mir auch schon durch den Kopf. Aber diese Möglichkeit würde ja verhindern, dass sich der User einloggen wenn er sich beim letzten Besuch nicht ausgeloggt hat und sein Datensatz noch in der Session-Tabelle existiert. Das wäre blöd.[/quote]
so ein quatsch, natürlich musst du vorher den alten datensatz
rauslöschen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Froschpopo
 2007-02-03 04:55
#35167 #35167
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hm also ich hab folgende Datenstruktur:
Code: (dl )
1
2
3
4
5
6
7
CREATE TABLE sessions (
id varchar(50) NOT NULL default '',
name varchar(50) NOT NULL default '',
datum timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY user (name, id)
)

id ist eine Session-ID aus A-Za-z0-9 und soll der erste einmalige schlüssel sein.

name muss auch einmalig sein da dies der Username ist.

Eigentlich sollte der bereits vorhandene Datensatz gelöscht werden, bevor REPLACE den neuen Eintrag anlegt.
Leider ignoriert REPLACE den vorhandenen Eintrag der denselben "name"-Wert hat wie der Neue.\n\n

<!--EDIT|Froschpopo|1170475753-->
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2007-02-02 14:47.