Maison  >  Article  >  cadre php  >  Analyse des problèmes d'utilisation du verrou exclusif Laravel lockForUpdate()

Analyse des problèmes d'utilisation du verrou exclusif Laravel lockForUpdate()

藏色散人
藏色散人avant
2021-01-08 13:56:243958parcourir
Vous trouverez ci-dessous

Tutoriel Laravel colonne pour présenter Laravel pour le verrouiller lockforupdate(), j'espère que cela sera utile aux amis qui en ont besoin !

Pour le verrouillage exclusif de MySQL, j'ai fait un test pour voir s'il y a un effet exclusif.

Test 1 : Tester le verrou exclusif sur la ligne de commande

Premier test sur la ligne de commande, ouvrir deux lignes de commande

D'abord sur la commande ligne 1 Ajoutez un verrou exclusif :

laravel 排他锁 lockForUpdate() 使用问题 Puis testez l'accès en ligne de commande 2 :

laravel 排他锁 lockForUpdate() 使用问题 Vous pouvez voir qu'il est effectivement bloqué une fois le commit terminé en ligne de commande. 1, la commande Le résultat de l'exécution est également affiché à la ligne 2.
Il n'y a donc aucun problème à tester les verrous exclusifs à partir de la ligne de commande.

Test 2 : Tester le verrouillage exclusif dans la méthode du contrôleur Laravel

Ce qui suit teste le verrouillage exclusif dans Laravel :

Deux routes :

Route::get('/locktest1','LockController@LockTest1');
Route::get('/locktest2','LockController@LockTest2');Le contenu des deux méthodes
et LockTest1 dans le contrôleur est le même : LockTest2

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);
accédez d'abord à l'itinéraire

, normal Imprimez les données. Personnellement, je suppose que la transaction n'est pas clôturée pour le moment. S'il y a une autre demande d'accès à la table de données, elle doit être bloquée. /locktest1Donc, lorsque je visite
ici, le résultat est que les données sont imprimées normalement. Pourquoi n'y a-t-il pas d'effet de blocage ? /locktest2

Test 3 : Méthode du contrôleur Laravel et test mixte de ligne de commande, verrouillage exclusif

1. Ouvrez d'abord la transaction dans la ligne de commande pour ajouter un. verrouillage exclusif , identique au fonctionnement de la ligne de commande 1 dans le test 1 ;

puis accédez à la route
, la page continue de fonctionner, indiquant que les données de la requête sont bloquées /locktest1 enfin validées dans la ligne de commande ;
2. Accédez d'abord à l'itinéraire
et imprimez les données normalement /locktest1 puis ouvrez la transaction dans la ligne de commande pour ajouter un verrou exclusif. La même opération que la ligne de commande 1 dans le test 1 a révélé que les données. a été interrogé normalement sans blocage ; cela signifie que l'opération de verrouillage exclusif dans la méthode du contrôleur de Laravel n'a pas réussi.

Résumé : Pourquoi lockForUpdate() de laravel n'a-t-il aucun effet ou est-ce qu'après l'exécution de la méthode du contrôleur laravel, la transaction se terminera automatiquement, n'entraîne aucun effet de blocage ?

Alors, refaites le test suivant :

Ajoutez une méthode sleep() à la méthode contrôleur de la route 1 :

DB::beginTransaction(); // 开启事务
$goods = Goods::lockForUpdate()->first();
print_r($goods);sleep(10);echo 'ddd';
Ensuite, accédez à la route 1

, La page attend d'être actualisée ; lors de l'accès à nouveau à la route 2 /locktest1, la page attend également d'être actualisée, indiquant que les données sont bloquées, car il n'y a pas de sleep() dans la route 2, et elle est exécutée immédiatement sous des conditions normales. circonstances. /locktest2Après 10 secondes, la page
imprime les données, et la page /locktest1 imprime également les données. /locktest2

À en juger par cela, le test 3 ci-dessus n'a pas produit d'effet de blocage, qui devrait être provoqué par la fin automatique de la transaction après la fin de la méthode du contrôleur.

Ce qui précède est une analyse personnelle. S'il y a un maître qui passe par là, veuillez laisser un message et dites-moi la bonne réponse !

Pour plus de connaissances liées à la programmation, veuillez visiter :

Enseignement de la programmation ! !

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer