Dans des scénarios de concurrence tels que des ruées sur les produits, une survente peut se produire. À l'heure actuelle, il est nécessaire de résoudre les problèmes causés par la concurrence.
Il n'y a aucune disposition native dans le langage PHP que les solutions de concurrence nécessitent. d'autres moyens d'obtenir un contrôle de concurrence.
Option 1 : Utiliser le verrouillage exclusif du verrouillage des fichiers
La fonction flock est utilisée pour obtenir le verrouillage des fichiers, ce lock Il ne peut être acquis que par un seul thread à la fois. Les autres threads qui n'ont pas acquis le verrou sont soit bloqués, soit n'ont pas réussi à l'acquérir
Lors de l'acquisition du verrou, interrogez d'abord l'inventaire. supérieur à 0, passez une commande puis libérez le verrou (apprentissage recommandé : Tutoriel vidéo PHP)
Option 2 : Utiliser le verrou pessimiste fourni par Mysql. base de données
Stockage Innodb Le moteur prend en charge le verrouillage au niveau de la ligne Lorsqu'une ligne de données est verrouillée, les autres processus ne peuvent pas opérer sur la ligne de données
Interroger et verrouiller la ligne. première ligne :
select stock_num from table where id=1 for update if(stock_num > 0){ //下订单 update table set stock_num=stock-1 where id=1 }
Option 3 : Utiliser une file d'attente
pour stocker les demandes de commande de l'utilisateur dans une file d'attente en séquence et utiliser un processus distinct dans le en arrière-plan pour traiter les demandes de commande dans la file d'attente
Option 4 : Utiliser Redis
Les opérations de redis sont toutes atomiques. Vous pouvez stocker l'inventaire des marchandises dans redis. Avant de passer une commande, effectuez une opération de diminution sur l'inventaire. Si la valeur renvoyée est supérieure ou égale à 0, etc. Vous pouvez passer une commande, sinon vous ne pouvez pas passer une commande. Cette méthode est plus efficace
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }
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!