Ich mache ein Skript, das Daten von einer Mysql MyISAM-Tabelle jedes Mal, dass dieses Skript angefordert/ausgeführt wird. Die Abfrage lautet etwa so:Counter vermeiden Wiederholung mit Multithread-Anfragen
SELECT * FROM Tabelle LIMIT $ offset, 10;
Das Problem ist, dass der $ offset 0 in der ersten Anfrage und 10 in der zweiten, 20 in der dritten usw. sein muss. Dann habe ich eine neue Tabelle erstellt, wo ich einen Zähler für $ offset, die jedes Mal +10 inkrementieren Das Skript ist angefordert.
Sie müssen wissen, dass das Skript zur selben Zeit viele Anfragen haben wird. die Anfrage sind nicht Benutzer (Besuche) die Anfrage sind meine Software läuft in mehr als 5 PC und jede dieser Software läuft mit mehr als 1000 Threads Anfragen an dieses Skript. Dann suche ich eine Lösung für nicht zurück zu diesen Threads die gleichen Ergebnisse, wenn 2 oder mehr Threads genau dieses Skript gleichzeitig anfordern. Auch ich brauche diesen Zähler wird perfekt inkrementieren.
function GetAndUpdateCounter($numberToAdd)
{
$link = mysql_connect('localhost','root','abcd1234');
if(!$link) die ('Could not connect to database: '.mysql_error());
mysql_select_db('dbcounter',$link);
// in the 2 lines below I have my question about what happend if 2 or
// more threads/request do this at same time, will get same result and will do same update
$result = mysql_query("SELECT id FROM counter");
mysql_query("UPDATE counter SET id=(id+$numberToAdd);");
$row = mysql_fetch_array($result, MYSQL_ASSOC);
mysql_close($link);
return $row['id'];
}
Beispiel Aufruf der Funktion
$offset = GetAndUpdateCounter(10);
$ q = mysql_query ("SELECT * FROM Tabellen LIMIT $ offset, 10");