Hi!
Ich bastle gerade an einem PHP-Skript zum auslesen von Spielstatistiken aus einer MySQL-Datenbank. Die Statistiken werden von einem Bot geschrieben, auf dessen Art und Weise die Tabelle zu schreiben ich keinen Einfluss habe. In der Datenbank gibt es eine Tabelle, die mit jedem Spiel 10 Zeilen, die den Statistiken der 10 Spieler aus dem Spiel entsprechen bekommt.
Nun ist es natürlich so, dass es auch Spieler gibt, die mehrere Spiele spielen, also öfter in der Tabelle auftauchen. Ich möchte nun per PHP eine neue Tabelle erzeugen, die jeden Spieler nur einmal und in der entsprechenden Zeile die gesammten Statistiken des Spielers enthält.
Mit jedem aufruf des Skripts, dass die zweite Tabelle in irgendeiner Art und Weise präsentiert, soll diese auch gleichzeitig aktualisiert werden. Da dies aber bei einer großen Spielzahl eher länger dauert und und ich das nicht bei jedem Seitenaufruf haben möchte, lese ich aus der ersten Tabelle nur bisher ungelesene Einträge aus, indem ich eine weitere Spalte "read" hinzufüge und diese auf nach dem lesen auf 1 setze. Die gelesenen Statistiken werden dann in die zweite Tabelle integriert.
Und jetzt kommt das Problem:
Es ist zwar unwahrscheinlich, aber darf nicht außer Acht gelassen werden, dass zwei gleichzeitig ausgeführte Skripte, die beide die ungelesenen Zeilen aus der ersten Tabelle in die zweite Tabelle integrieren wollen sich in die Quere kommen, das heißt sie lesen beide gleichzeitig und integrieren die Zeilen doppelt, was die zweite Tabelle verfälscht.
Dass das möglich ist, habe ich mit diesem Skript ausprobiert:
<?php
$test = $HTTP_GET_VARS['test'];
if($test == 1)
{
$connection = mysql_connect("localhost", "root", "meinpasswort");
mysql_select_db("test", $connection);
mysql_query("UPDATE `test` SET `wert` = '1' WHERE `id` =1 LIMIT 1 ;", $connection);
$a = time();
for($i = 0; $i < 5; $i = time() - $a) {}
mysql_query("UPDATE `test` SET `wert` = '42' WHERE `id` =1 AND `wert` = '1' LIMIT 1 ;", $connection);
mysql_close($connection);
}
else
{
$connection = mysql_connect("localhost", "root", "meinpasswort");
mysql_select_db("test", $connection);
mysql_query("UPDATE `test` SET `wert` = '56' WHERE `id` =1 AND `wert` = '1' LIMIT 1 ;", $connection);
mysql_close($connection);
}
?>
Alles anzeigen
Jetzt zwei fragen:
1. Wie kann ich das verhindern?
2. Kann ich wenigstens davon ausgehen, dass der MySQL-Server zwei Queries, die auch nur ansatzweise miteinander zu tun haben, NACHEINANDER ausführt?
Vielen Dank fürs Durchlesen!