Heim > Artikel > Backend-Entwicklung > Lösung für das Problem bei der Verarbeitung von PHP+MySQL-Transaktionen mit hoher Parallelität und Sperrung
Dieser Artikel stellt hauptsächlich die Lösung für das Problem der Sperrtransaktionsverarbeitung mit hoher Parallelität in PHP + MySQL vor. Jetzt kann ich ihn mit Ihnen teilen
Beispiele in diesem Artikel Eine Lösung für das Problem der Sperrtransaktionsverarbeitung mit hoher Parallelität in PHP+MySQL. Teilen Sie es als Referenz mit allen:
1. Hintergrund:
Bestimmen Sie beim Einfügen von Daten, ob Die Testtabelle hat den Benutzernamen „Wenn keine mraz-Daten vorhanden sind“, wird die Meldung „eingefügt“ angezeigt. Der Zweck besteht darin, nur einen Datensatz mit dem Benutzernamen „mraz“ einzufügen.
2. Die allgemeine Programmlogik ist wie folgt:
$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error()); mysqli_select_db($conn, 'mraz'); $rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" '); $row = mysqli_fetch_array($rs); if($row['total']>0){ exit('exist'); } mysqli_query($conn, "insert into test(username) values ('mraz')"); var_dump('error:'.mysqli_errno($conn)); $insert_id = mysqli_insert_id($conn); echo 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);
3 Bei einer geringen Anzahl von Anfragen wird das Programm keine Probleme mit der Logik haben. Sobald jedoch eine Anforderung mit hoher Parallelität ausgeführt wird, wird das Programm nicht wie erwartet ausgeführt und es werden mehrere Datensätze mit dem Benutzernamen „mraz“ eingefügt.
4. Lösung : Verwenden Sie die Isolation der FOR UPDATE-Anweisung und -Transaktion . Beachten Sie, dass FOR UPDATE nur für InnoDB gilt und sich in einer Transaktion (BEGIN/COMMIT) befinden muss, um wirksam zu werden.
Nach dem Anpassen des Codes lautet der Code wie folgt:
$conn = mysqli_connect('127.0.0.1', 'root', '111111') or die(mysqli_error()); mysqli_select_db($conn, 'mraz'); mysqli_query($conn, 'BEGIN'); $rs = mysqli_query($conn, 'SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE'); $row = mysqli_fetch_array($rs); if($row['total']>0){ exit('exist'); } mysqli_query($conn, "insert into test(username) values ('mraz')"); var_dump('error:'.mysqli_errno($conn)); $insert_id = mysqli_insert_id($conn); mysqli_query($conn, 'COMMIT'); echo 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);
5. Verwenden Sie dann PHPs Curl zur Simulation Da es viele gleichzeitige Anfragen für das PHP-Skript gibt, überprüfen Sie die Datenbank und es wird nur ein Datensatz mit dem Benutzernamen „mraz“ vorhanden sein. Erzielen Sie die erwarteten Ergebnisse der Programmausführung~
Verwandte Empfehlungen:
PHP+Mysql-Methode zur Verhinderung von SQL-Injection
PHP+ So implementieren Sie die Paging-Anzeige in MySQL
PHP+MySQL-Timing-Datenstatistikoptimierung
Das obige ist der detaillierte Inhalt vonLösung für das Problem bei der Verarbeitung von PHP+MySQL-Transaktionen mit hoher Parallelität und Sperrung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!