Plusieurs méthodes de traitement simultané en php

王林
Libérer: 2023-04-07 14:32:01
original
3346 Les gens l'ont consulté

Plusieurs méthodes de traitement simultané en php

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
Copier après la connexion
if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}
Copier après la connexion

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{
//库存不足
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal