Schrift
[thread]3637[/thread]

doppel-INSERT vermeiden durch locking



<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
Froschpopo
 2005-11-06 21:51
#33749 #33749
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
also mal ne frage:

mit LOCK TABLES kann ich ja nur ne ganze Tabelle sperren! Das will ich aber garnicht. Will nur nicht, dass jemand z.b. durch zu schnelles Doppelklicken zweimal ein Insert macht, noch bevor das Script mit einem SELECT überprüfen kann ob der EIntrag schon existiert. Das ist nämlich in meinem CGI-Script manchmal der Fall.

Also kurz: Ich möchte nicht die gesamte Tabelle locken, sondern nur verhindern, dass jemand nen doppelten INSERT macht !

Gibt's da ne Lösung?
pq
 2005-11-06 22:00
#33750 #33750
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
ja, sessions
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
 2005-11-06 22:07
#33751 #33751
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
na ihr seid lustig... ihr ratet mir doch die ganze zeit die sessions über eine datenbank zu verwalten und das wollte ich eigentlich jetzt machen! ich will vermeiden, dass jemand durch zu schnelles doppelklicken zwei sessions beginnt !
pq
 2005-11-06 22:18
#33752 #33752
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
was ist das problem? pro user nur eine session erlaubt? dann erstelle pro user auch nur eine session, indem du nachschaust, ob für den user schon eine exisitiert.
ansonsten kannst du das ganze vermutlich mit etwas javascript unterstützen, indem du doppelklicks verhinderst.
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
 2005-11-06 22:21
#33753 #33753
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wie soll ich denn gucken, ob er schon existiert?

mein script sieht so aus:

Code: (dl )
1
2
3
4
if ($dbh->selectrow_array("select count(*) from users where name = '$name'") == 0)
{
  # INSERT
}

DAS ist aber nicht sicher, denn wenn man das Script im Milisekundenbereich zweimal hintereinander startet, dann macht er zwei Insert's weil SELECT einfach nicht so schnell reagieren kann.\n\n

<!--EDIT|Froschpopo|1131308574-->
ptk
 2005-11-06 22:29
#33754 #33754
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du machst ein Feld (z.B. IP) UNIQUE, dann gibt es einen Fehler, wenn das zweite INSERT gemacht wird.
Froschpopo
 2005-11-06 22:41
#33755 #33755
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
hm... verträgt sich das denn mit dem ersten primary key ?
ptk
 2005-11-06 23:41
#33756 #33756
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
UNIQUE ist unabhängig vom Key.
pq
 2005-11-06 23:49
#33757 #33757
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,06.11.2005, 21:21]DAS ist aber nicht sicher, denn wenn man das Script im Milisekundenbereich zweimal hintereinander startet, dann macht er zwei Insert's weil SELECT einfach nicht so schnell reagieren kann.[/quote]
dann brauchst du eine transaktion. dann kriegt das select erst ein ergebnis,
wenn der erste INSERT durch ist.
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
 2005-11-07 19:32
#33758 #33758
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
was haltet ihr eigentlich von einem SESSION-Server? Also ein Daemon, der über eine Pipe die Sessions verwaltet.
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2005-11-06 21:51.