Maison  >  Article  >  base de données  >  La haute concurrence MySQL génère des numéros de commande uniques

La haute concurrence MySQL génère des numéros de commande uniques

藏色散人
藏色散人avant
2020-08-29 11:59:213917parcourir

Avant-propos

Après la publication de cet article de blog, un ami a demandé s'il y avait un La version du serveur SQL a désormais "numéro de commande unique de génération de concurrence élevée du serveur SQL "

Recommandé : "tutoriel mysql "

1 , reproduction de scène

Dans un système d'achat, de vente et d'inventaire ERP ou d'autres systèmes tels que 0A, si plusieurs personnes effectuent l'opération de génération de numéros de commande en même temps, il est facile pour plusieurs personnes d'obtenir le même numéro de commande, ce qui aura un impact négatif sur l'activité de l'entreprise, provoquant des pertes irréparables

2. Comment éviter les situations de forte concurrence où les numéros de commande ne sont pas uniques

Nous pouvons utiliser des procédures et des données stockées. tables pour construire une table et créer des procédures stockées. Les procédures stockées sont responsables de générer des numéros de commande, et la table est responsable de la gestion des problèmes d'unicité
La haute concurrence MySQL génère des numéros de commande uniques

Lorsque la procédure stockée génère d'abord un numéro de commande, écrivez le numéro de commande dans le tableau, puis affichez le résultat du numéro de commande et générez. Lorsque le numéro de commande est écrit dans le tableau, deux situations se produiront. Pourquoi ? Parce que notre table a une clé primaire (unicité de la clé primaire)

  • peut s'écrire : Lorsque la table n'a pas le même numéro de commande, le numéro de commande généré est écrit dans la table
  • Ne peut pas être écrit : lorsque le même numéro de commande existe dans le tableau, c'est-à-dire que le numéro de commande généré ne peut pas être écrit dans le tableau et que le numéro de commande ne peut pas être obtenu, garantissant ainsi qu'un numéro de commande unique est généré dans des conditions de concurrence élevée.

3. Le processus de génération d'un numéro de commande unique sous haute concurrence

Ce qui suit expliquera le processus de génération d'un numéro de commande unique à l'aide du code et des opérations réelles

Étape 1 : Créez une table de données et définissez Le champ du numéro de commande est la clé primaire (la clé du numéro de commande unique)

La haute concurrence MySQL génère des numéros de commande uniques

Étape 2 : Créez une procédure stockée pour générer le numéro de commande

Le format du numéro de commande généré est : Préfixe personnalisé + année, mois et jour + suffixe (001, 002, 003)
1. 🎜>L'entrée est BILL_TYPE (préfixe) et la sortie est BILL_NOP (numéro de commande)

CREATE DEFINER = CURRENT_USER PROCEDURE `getbillno`(in BILL_TYPE VARCHAR(3), out BILL_NOP varchar(25))BEGIN

2 Générez l'année, le mois et le jour et le suffixe année, mois. et le jour est l'heure actuelle du système et la valeur initiale du suffixe est 0

DECLARE currentDate varCHAR (15);DECLARE lastno INT DEFAULT 0;SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate;

3. Formulaire de requête, obtenez le numéro d'ordre de la table Interrogez la table. et obtenez le dernier numéro de commande avec le préfixe lié au contenu personnalisé

SELECT IFNULL(BILL_NO, 'notnull') INTO BILL_NOP  FROM temp_bill 
  WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and
  SUBSTRING(BILL_NO,4,8) =currentDate  ORDER BY BILL_NO DESC LIMIT 1;

4. Générez le numéro de commande

  • Si le numéro de commande obtenu à l'étape précédente n'est pas vide, le numéro de commande nouvellement généré sera +1 sur le numéro de commande d'origine

    Exemple : Le numéro de commande obtenu : UIE20200611015

    C'est la commande générée Le numéro est : UIE20200611016

  • Si le numéro de commande obtenu à l'étape précédente est vide, le suffixe du numéro de commande nouvellement généré est 001

    Exemple : Le numéro de commande généré : UIE20200611001

IF BILL_NOP !='' THEN
 SET lastno = CONVERT(SUBSTRING(BILL_NOP, -3), DECIMAL) ; 
 SELECT 
  CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;ELSE
 SELECT 
  CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;END IF;

5. Insérez le numéro de commande généré dans le tableauSi le même
numéro de commande existe dans le tableau, l'insertion dans le tableau échoueSi le table Si le même
numéro de commande n'existe pas, le numéro de commande est inséré avec succès dans la table

INSERT INTO temp_bill (BILL_NO, BILL_TYPE) VALUES (BILL_NOP,BILL_TYPE) ;

6. Renvoie le numéro de commande unique

Lorsque le La commande est insérée dans le tableau avec succès, le numéro de commande unique peut être renvoyé (Si l'étape précédente échoue, cette étape ne sera pas exécutée)

SELECT   BILL_NOP;

4. Exécution des résultats

1. de tout, il n'y a aucune donnée dans ma table, et le préfixe sera généré (ce que j'ai saisi : UIE ) + année, mois et jour (

20200611) + 001 (la première donnée, c'est donc 001)

soit :
UIE20200611001
2 Lorsque je le saisis pour la deuxième fois, Puisqu'il y a des données dans le tableau, le dernier numéro de commande sera ajouté avec un suffixe de 1

, c'est-à-dire :

UIE20200611002

La haute concurrence MySQL génère des numéros de commande uniques 5. Un résumé qui n'est pas un résumé

L'auto-évaluation d'une humble recrue :

J'espère que cet article pourra aider tout le monde Si vous avez suffisamment de points, téléchargez-le. Si vous n'avez pas de points, tapez sur l'image. Quoi qu'il en soit, la quantité n'est pas grande non plus.
Si vous êtes étudiant et n'avez pas de points, vous pouvez m'envoyer un message privé et je vous enverrai le code source gratuitement

Lien de téléchargement du code : mysql_getbillno.sql

Capture d'écran du code :


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