Maison  >  Article  >  développement back-end  >  Solution au problème de traitement des transactions de verrouillage à haute concurrence PHP + MySQL

Solution au problème de traitement des transactions de verrouillage à haute concurrence PHP + MySQL

不言
不言original
2018-05-02 09:51:291880parcourir

Cet article présente principalement la solution au problème du traitement des transactions à verrouillage à haute concurrence dans PHP+MySQL. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

. Exemples dans cet article Une solution au problème du traitement des transactions à verrouillage à haute concurrence dans PHP+MySQL. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

1. Contexte :

Maintenant, il existe une telle demande lors de l'insertion de données, déterminez si le. La table de test a un nom d'utilisateur « S'il n'y a pas de données mraz », elle sera insérée. S'il y en a, elle affichera « inséré ». Le but est d'insérer un seul enregistrement avec le nom d'utilisateur « mraz ».

2. La logique générale du programme est la suivante :

$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. il y a un petit nombre de requêtes, il n'y aura aucun problème avec la logique du programme. Cependant, une fois qu'une requête à haute concurrence est exécutée, le programme ne s'exécute pas comme prévu et plusieurs enregistrements portant le nom d'utilisateur « mraz » seront insérés.

4. Solution  : Utilisez l'isolation de l'instruction FOR UPDATE et de la transaction . Notez que FOR UPDATE n'est applicable qu'à InnoDB et doit être dans une transaction (BEGIN/COMMIT) pour prendre effet.

Après avoir ajusté le code, il est le suivant :

$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. Utilisez curl de PHP pour simuler. requêtes simultanées élevées. Script PHP, vérifiez la base de données et il n'y aura qu'un seul enregistrement avec le nom d'utilisateur 'mraz'. Atteindre les résultats attendus de l'exécution du programme~

Recommandations associées :

Méthode PHP+Mysql pour empêcher l'injection SQL

PHP+ Comment implémenter l'affichage de la pagination dans MySQL

Optimisation des statistiques de données de synchronisation PHP+MySQL

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn