Cette fois, je vais vous apporter une explication détaillée des étapes permettant à PHP+MySQL de gérer les transactions de verrouillage à haute concurrence, et des notes pour PHP+ MySQL pour gérer les transactions de verrouillage à haute concurrence. Quels sont les problèmes ?
1. Contexte :
Maintenant, il existe une telle demande Lors de l'insertion de données, déterminez si la table de test contient des données avec le nom d'utilisateur '. mraz', sinon, il sera inséré, s'il y en a, il 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 'insert_id:'.$insert_id.'<br>'; mysqli_free_result($rs); mysqli_close($conn);
3. 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.
Le code ajusté est le suivant :
$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);
Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres. articles connexes sur le site Web PHP chinois !
Lecture recommandée :
Analyse de cas de génération d'affiches de code QR avec PHP
Explication détaillée des étapes de compression dynamique fichiers js et css avec PHP
Explication détaillée des étapes de modification PHPExcel
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!