folgendes Problem (Umfrageformular App)
a) Formular wird gesendet
b) User wird Authentifiziert
c) Darf User Daten Senden ?
d) select max(user_count) from vote => $maxuser
e) $current_user=$maxuser+1
f) select max(vote_id) from vote => $maxvote
g) $current_vote=$maxvote+1
h) ... andere arbeit (zeitaufwendig !) ...
i) insert into vote(...) values ($max_vote, ..., $max_user)
j) wiederhole i für n votes
Das Problem liegt darin begraben, dass mehrere Prozesse gleichzeitig durchlaufen können und so die $max_vote und $max_user durcheinander geraten können.
Will heissen:
Prozess A schreib in die Tabelle Vote (und ist noch nicht fertig !!) währenddem Prozess B aus Tabelle Vote die max_vote ausliest und von dort weg alle Daten von Prozess A überschreibt
Nun... dacht ich mir, programmierst du halt einen globalen lock
Code: Alles auswählen
do {
sleep(0.1);
$lockfile=fopen("/tmp/ubeu_submit_lockfile","r");
} while ($lockfile);
$lockfile=fopen("/tmp/ubeu_submit_lockfile","w"); // Set LOCK
Code: Alles auswählen
unlink($lockfile);
Wieso genau sich mit diesem Code ein Deadlock ergeben kann ist mir schleierhaft :/
Any Ideas ??
*thx*4help