Schrift
[thread]8718[/thread]

Frage zu unlink()

Leser: 2


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Froschpopo
 2007-02-03 16:54
#73976 #73976
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich will prüfen, ob unlink() erfolgreich war und dann in der Datenbank den Zähler herabsetzen der die Dateien erfasst.

Code:
Code: (dl )
1
2
3
4
5
6
7
my $successfully = 1;

unlink($file) or $successfully = 0;

if ($successfully == 1) {
$dbh->do("UPDATE files SET counter = counter-1 WHERE id='$id'");
}


Ist darauf verlass oder kann es hier durch zu schnelles Submit (CGI) zu einer doppelten Subtraktion kommen?
Es kann ja mal passieren, dass durch ein extrem schnelles Klicken eines Submit-Buttons sich zwei Prozesse so überschneiden, dass sie quasi zeitgleich dieselbe Operation vornehmen und dann theoretisch beide den DBI::do() ausführen würden.
pq
 2007-02-03 17:48
#73977 #73977
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
unlink ist atomar, somit wird der prozess, der unlink ans zweites aufruft,
$successfully auf 0 setzen.
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
renee
 2007-02-03 17:50
#73978 #73978
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Eins der beiden unlinks sollte fehl schlagen, weil auf jeden Fall einmal die Datei nicht mehr vorhanden ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Froschpopo
 2007-02-03 18:04
#73979 #73979
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Was bedeutet atomar in diesem Zusammenhang?

Also von MySQL kenne ich folgende Problematik die ich anhand eines kleinen Beispiels aufzeigen will:
Code: (dl )
1
2
3
4
if ($dbh->selectrow_array("select count(*....") < 1) {
#hier greift ein anderer prozess zu
$dbh->do(...)
}


Der obige Code prüft auf vorhandensein eines Datensatzes, bevor er ein neues INSERT veranlasst. Greift ein anderer Prozess genau dazwischen, gibt es zwei INSERT's.
Um das zu umgehen kann man nur die ganze Tabelle locken oder halt mit UNIQUE's arbeiten, was in manchen Fällen ja schlichtweg nicht gewollt ist.
nepos
 2007-02-03 19:47
#73980 #73980
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das ist genau der Punkt, wo man z.B. Transaktionen benutzt...
Du solltest dich da echt mal ein wenig einlesen.
Froschpopo
 2007-02-03 20:12
#73981 #73981
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Also laut Tiger-Buch bildet man damit aber Gruppen! Ein einzelnes Statement ist aber doch keine Gruppe oder muss ich da auch commits bzw rollbacks behandeln? das gäbe für mich irgendwie keinen sinn.
Für mich stellt sich das so hin, dass man ne Transaktion z.b. dafür braucht, wenn es zwischen zwei Statements z.b. einen Stromausfall gibt und das zweite nichtmehr ausgeführt werden kann.\n\n

<!--EDIT|Froschpopo|1170526432-->
pq
 2007-02-03 22:04
#73982 #73982
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,03.02.2007, 17:04]Was bedeutet atomar in diesem Zusammenhang?[/quote]
ein atom ist dir ein begriff, oder? atomar heisst unteilbar. ein system
kann per unlink nicht zweimal die gleiche datei löschen (wenn sie nicht
zwischendurch wieder angelegt wurde).
ein select und danach ein do ist nicht atomar.
ansonsten solltest du dir mal ein paar informatik-grundlagen zulegen.
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-03 22:06
#73983 #73983
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,03.02.2007, 19:12]Für mich stellt sich das so hin, dass man ne Transaktion z.b. dafür braucht, wenn es zwischen zwei Statements z.b. einen Stromausfall gibt und das zweite nichtmehr ausgeführt werden kann.[/quote]
wenn du sensible transaktionen durchführst und einen stromausfall, aber
keine USV, hast du eh ein ganz anderes problem.
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
nepos
 2007-02-04 13:04
#73984 #73984
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn du eine gescheite Datenbank nutzt, ist auch sowas kein Problem. Und durch die Transaktion ist dann wenigstens sichergestellt, dass nicht nur ein Teil der Anweisungen ausgeführt wurde.
ptk
 2007-02-04 20:25
#73985 #73985
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Die wahrscheinlich nicht so gescheite Datenbank MySQL braucht für das Reparieren einer durch Stromausfall kaputtgegangenen Datenbank ewig --- ein paar *Tage* habe ich schon mal erlebt, wenn die Datenbank groß genug ist. Was gibt es für Alternativen?
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-02-03 16:54.