MySQL zweimalige Ausführung möglich

ThiKool

Erfahrenes Mitglied
Hallo zusammen,
Ich bin gerade auf ein riesen Problem in meinem Code gestoßen.

Und zwar geht's darum das man zB Gegenstände verkaufen kann. Diese sind in der Tabelle items.

Sind sie verkauft wird der Eintrag gelöscht und dem User coins in der User Tabelle gutgeschrieben. Da das Iren nun gelöscht ist kann es kein zweites Mal verkauft werden.

Ich hatte gerade Smartphone und Tablet nebeneinander liegen und hab zeitgleich auf den Verkaufen Button geklickt... Und siehe da bei Ca der Hälfte der Fälle hat man dafür doppelt Geld bekommen...

Wie kann das sein und was mache ich falsch? Sind die getrennten Statements schuld die nacheinander von PHP aufgerufen werden? Ich nutze ausschließlich innodb s in Verbindung mit pdo

Ich hoffe ihr könnt mir helfen.
Vielen dank
 
Zuletzt bearbeitet:
Hi

Bei den Items gibt es keine "Anzahl"-Spalte oder sowas; also entweder es existiert oder eben nicht.
Und zurzeit machst du
a) Select auf Item, um den Preis herauszufinden
b) Delete auf Item
c) Update auf User wegen dem Geld

Richtig?

Das Problem, das du erkannt hast, ist relativ einfach zu lösen (außer man hat viele Stellen vom Code zu ändern): Beim Deleten mit affected_rows in der jeweiligen Programmiersprache (heißt immer irgendwie so) abfragen, wieviel Zeilen gelöscht wurden. Wenn 1 ists ok, wenn 0 dann war die Zeile schon weg, also kein Geld ändern und Fehlermeldung an den User.

Allerdings gibts noch ein paar Probleme mehr:
(kommt noch)
 
Zuletzt bearbeitet:
a ja, den Thread gibts auch noch :/
Nur kurz, hab grad wenig Zeit:

Was passiert, wenn das Programm zwischen Delete und Geldupdate abbricht? (warum auch immer. Segfault, Stromausfall, .etc,etc,etc,..). => Transactions. Und die führen aber wiederum das Problem ein, dass die Änderungen erst verzögert sichtbar sind (bzw. keine Garantien, unabhängig vom Mode) => Row locks.
...
 
Hi danke das du dir Zeit nimmst :)

Transaktion habe ich leide auch noch nicht flächendeckend eingebaut...

Würden die das ursprüngliche Problem gleich mitbeheben?

Gibt es denn da wirklich keine elegantere Möglichkeit ähnlich wie bei dem Transaktionen das die betreffenden statements erstmal komplett durchlaufen bis der nächste request verarbeitet wird?
 
Wie schon geschrieben, nein, Transactions lösen das Problem (allein) nicht.
Eben da sie keine Hintereinanderausführung sind. Dafür zuerst locken.
 
Hallo zusammen,

Ich habe jetzt alles soweit gefixt allerdings frage ich mich ob es im selben Browser (über scripts die zB per tampermonkey eingebunden werden) möglich ist zeitgleich zwei requests abzusetzen?

Den physisch ist es mit zwei browsertabs ja nicht möglich so schnell zu klicken.

Auch habe ich mich noch nicht mit curl requests befasst aber da man sich in meine Anwendung einloggen muss fällt der Fall ja wohl raus oder?

Danke & viele Grüße
 
Wenn es ordentlich abgesichert ist ist es egal, ob die Requests aus dem selben Browser/Tab/Curl/etc. oder nicht kommen; sollte immer passen.

PS: Mit Curl Logins nachzubauen ist kein Problem.
 
Zuletzt bearbeitet:
Danke dir,

wie könnte ich denn ein zeitgleich doppelten Request zum testen nachbauen?
Ich habs bis jetzt mit ajax .load() und iframes versucht, allerdings scheinen die das ganze prozederual auszuführen.
 
Wenn es nicht schlimm ist, die Seite zum Testen kurzzeitig kaputt zu machen, könnte man zwischen die zusammenhängenden Abfragen ein sleep(5) reintun (oder auch 10, 15... nur kein Timeout riskieren) Dann ganz gemütlich über mehrere Browsertabs aufrufen, und danach eben prüfen ob die DB-Werte ok sind.
 

Neue Beiträge

Zurück