Test 1 : Tester le verrou exclusif sur la ligne de commande
Premier test sur la ligne de commande, ouvrir deux lignes de commandeD'abord sur la commande ligne 1 Ajoutez un verrou exclusif :
Puis testez l'accès en ligne de commande 2 :
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
etLockTest1
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.
/locktest1
Donc, 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.
Alors, refaites le test suivant :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 ?
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. /locktest2
Après 10 secondes, la page
imprime les données, et la page /locktest1
imprime également les données. /locktest2
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!