Maison >développement back-end >tutoriel php >Explication détaillée des étapes de gestion des transactions de verrouillage à haute concurrence avec PHP+MySQL

Explication détaillée des étapes de gestion des transactions de verrouillage à haute concurrence avec PHP+MySQL

php中世界最好的语言
php中世界最好的语言original
2018-05-16 11:38:072792parcourir

Explication détaillée des étapes de gestion des transactions de verrouillage à haute concurrence avec PHP+MySQL

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!

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