Hallo,
ich habe folgendes Problem.
Ein Benutzer erstellt eine Verkaufs anfrage (Ihm werden in der Datenbank EUR abgezogen)
Diese Verkaufs anfrage kann wieder storniert werden. Bei dem Storno frage ich folgendes ab:
$stmt = $db->prepare("SELECT eur FROM offer WHERE active = 1 AND id = ?");
$stmt->execute(array($_POST['id']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row) {
//EUR wieder gutschreiben
//Active = 0 setzen
}
Jetzt könnte es sein, das ein Benutzer das Script innerhalb Sekunden mehrmals aufruft.
Es passiert also, das der Benutzer 2x die EUR wieder gutgeschrieben bekommt.
Jetzt habe ich folgendes versucht:
$query = mysql_query("SELECT GET_LOCK('".$userid."', 10) AS free");
$row = mysql_fetch_assoc($query);
if($row['free']) {
$stmt = $db->prepare("SELECT eur FROM offer WHERE active = 1 AND id = ?");
$stmt->execute(array($_POST['id']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if($row) {
//EUR wieder gutschreiben
//Active = 0 setzen
}
mysql_query("SELECT RELEASE_LOCK('".$userid."')");
}
Bei meinem Test hat es funktioniert. Ich habe das Script mehrmals gleichzeitig aufgerufen. Es wird jetzt immer gewartet, bis das Lock wieder frei ist und erst dann wird das Script weiter ausgeführt (mit sleep() getestet)
Jedoch ist es schon wieder vor gekommen, das ein Benutzer 2x EUR wieder gutgeschrieben bekommen hat.
Gibt es dafür noch eine andere Lösung?
Sollte ich mit IS_FREE_LOCK() vorher das Lock abfragen?
Besten Gruß
Simon