Dans des scénarios de concurrence tels que des ruées sur les produits, une survente peut se produire. À ce stade, il est nécessaire de résoudre ces problèmes causés par la concurrence.
Il n'existe pas de solution de concurrence native dans le langage PHP, d'autres méthodes sont donc nécessaires pour réaliser le contrôle de concurrence.
Option 1 : Utiliser le verrouillage exclusif du verrouillage de fichier
La fonction flock est utilisée pour acquérir le verrouillage de fichier. Ce verrou ne peut être acquis que par un seul thread à la fois. , et aucun autre thread n'est acquis. Le thread qui obtient le verrou est bloqué ou ne parvient pas à l'acquérir. Lors de l'acquisition du verrou, interrogez d'abord l'inventaire. Si l'inventaire est supérieur à 0, passez une commande, réduisez l'inventaire, puis libérez le verrou.
Option 2 : Utiliser le verrou pessimiste fourni par la base de données MySQL
Le moteur de stockage Innodb prend en charge les verrous au niveau de la ligne Lorsqu'une ligne de données est verrouillée, d'autres processus. ne peut pas accéder à la ligne. Les données sont exploitées.
Première requête et verrouiller la 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 la file d'attente
pour stocker la demande de commande de l'utilisateur dans une file d'attente en séquence, dans l'arrière-plan Utilisez un processus distinct pour gérer 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 et effectuer une opération de diminution sur l'inventaire avant de placer un. order. , si la valeur renvoyée est supérieure ou égale à 0, vous pouvez passer une commande, sinon vous ne pouvez pas passer une commande.
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下订单 }else{ //库存不足 } }else{ //库存不足 }
Tutoriel recommandé : Tutoriel vidéo PHP
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!