Heim  >  Artikel  >  Backend-Entwicklung  >  Lösung für das Problem bei der Verarbeitung von PHP+MySQL-Transaktionen mit hoher Parallelität und Sperrung

Lösung für das Problem bei der Verarbeitung von PHP+MySQL-Transaktionen mit hoher Parallelität und Sperrung

不言
不言Original
2018-05-02 09:51:291882Durchsuche

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 &#39;insert_id:&#39;.$insert_id.&#39;<br>&#39;;
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(&#39;127.0.0.1&#39;, &#39;root&#39;, &#39;111111&#39;) or die(mysqli_error());
mysqli_select_db($conn, &#39;mraz&#39;);
mysqli_query($conn, &#39;BEGIN&#39;);
$rs = mysqli_query($conn, &#39;SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE&#39;);
$row = mysqli_fetch_array($rs);
if($row[&#39;total&#39;]>0){
  exit(&#39;exist&#39;);
}
mysqli_query($conn, "insert into test(username) values (&#39;mraz&#39;)");
var_dump(&#39;error:&#39;.mysqli_errno($conn));
$insert_id = mysqli_insert_id($conn);
mysqli_query($conn, &#39;COMMIT&#39;);
echo &#39;insert_id:&#39;.$insert_id.&#39;<br>&#39;;
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn