Ich habe in letzter Zeit einige Web-Entwicklungsarbeiten in PHP gemacht, die mich dazu gebracht haben, die Sprache im Allgemeinen zu studieren. Bis jetzt musste ich es nicht benutzen, um mit einer Datenbank zu interagieren, aber ich weiß, dass es viele praktische Funktionen dafür bietet.PHP und Nebenläufigkeit
Obwohl ich grundlegende SQL kenne und mit grundlegender Manipulation von Daten in einer Datenbank gearbeitet habe, verstehe ich nicht, wie Webentwickler, die ihre Websites um PHP/Javascript/SQL aufbauen, Benutzer, die die gleichen Daten bearbeiten, verwalten können gleiche Zeit.
Nehmen wir zum Beispiel an, Sie haben eine Blackjack-Website, die Benutzer in eines von zwei Teams teilt, wenn sie sich anmelden. Jedes Mal, wenn ein Nutzer ein Spiel gewinnt, wird ein Teil seiner Gewinne zu einer laufenden Summe für dieses Team addiert.
lässt also die Pseudo-Code sagen für die Funktion, tut dies etwa wie folgt aussieht:
...
$total = mysql_query("SELECT score FROM team1");
$total = $total + $mytotal;
mysql_query("UPDATE team1 SET score='".$total."'");
...
Wenn zwei Spieler gleichzeitig spielen, ist es sehr gut möglich, dass sie beide vor dem anderen SELECT nennen Man hat die Möglichkeit, die Tabelle zu inkrementieren und zu aktualisieren, so dass Änderungen eines Benutzers sofort überschrieben werden.
Meine Frage ist, wie vermeidet man das? Ist es mit PHP auf der Code-Ebene gemacht, oder gibt es Funktionen, die von der Datenbank zur Verfügung gestellt werden, die Sie verwenden, um dies zu verhindern?
Ich habe einige Nachforschungen gemacht, und es scheint, dass PHP bietet einen semaphore Mechanismus, und ich habe auch festgestellt, dass mysql bietet eine LOCK table feature. Ich bin mir jedoch nicht sicher, welche von beiden in der Praxis verwendet wird.
Vielen Dank an alle für mehrere große Antworten, die ich vom Lernen bin - aber ich mehr war auf der Suche für das, was in komplexeren Problemen Gleichzeitigkeit denen PHP die beste Praxis ist, wo Eine einzelne Zeile von SQL passt nicht. (Sorry, wenn mein Beispiel dazu irreführend war) –