Maison  >  Article  >  base de données  >  La haute concurrence du serveur SQL génère un numéro de commande unique

La haute concurrence du serveur SQL génère un numéro de commande unique

藏色散人
藏色散人avant
2020-08-29 12:01:382645parcourir

Avant-propos

Il y a quelques jours, j'ai écrit un article sur la façon de générer des numéros de commande uniques dans MySQL à haute concurrence , quelqu'un a envoyé un message privé pour demander s'il existe une version du serveur SQL Aujourd'hui à midi, j'ai écrit une implémentation à haute concurrence de la version du serveur SQL pour générer un numéro de commande unique. et SQL Server sont les mêmes. La raison principale est que certaines de leurs syntaxes sont différentes, vous constaterez donc que la description textuelle de cet article est presque la même, seuls le code et l'interface sont différents.

Recommandé : "Tutoriel SQL"

1. Reproduction de scène

Dans un système d'achat et de vente ERP ou d'autres systèmes tels que 0A, le cas échéant sont multiples Si des 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, entraînant des pertes irréparables pour l'activité de l'entreprise

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

Nous pouvons utiliser des procédures stockées et des tables de données pour construire une table et créer des procédures stockées. La procédure stockée est responsable de la génération des numéros de commande, et la table est responsable de la gestion des problèmes d'unicité
La haute concurrence du serveur SQL génère un numéro de commande uniqueLorsque la procédure stockée génère un numéro de commande, écrivez d'abord le numéro de commande dans le tableau, puis affichez le résultat du numéro de commande. Lors de l'écriture du numéro de commande généré dans le tableau, deux situations se produiront. Parce que notre table a une clé primaire (unicité de la clé primaire)

  • peut s'écrire : Lorsqu'il n'y a pas de même numéro de commande dans la table, 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, le numéro de commande généré ne peut pas être écrit dans le tableau et le numéro de commande ne peut pas être obtenu, garantissant ainsi qu'un numéro de commande unique est généré sous haute concurrence

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 opérations réelles


Étape 1 : Créez une table de données et définissez le champ du numéro de commande comme clé primaire (la clé du numéro de commande unique)
La haute concurrence du serveur SQL génère un numéro de commande unique
É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. Créez d'abord une procédure stockée Le paramètre est @ BILL_TYPE

CREATE  PROCEDURE [dbo].[GetBillNO]
 @BILL_TYPE nvarchar(3)

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

declare @BILL_NO nvarchar(15);declare @currentDate nvarchar(15);declare @lastno INT = 0;set @currentDate = Convert(varchar(10),Getdate(),112);

3. Interrogez la table et obtenez le numéro d'ordre de la table Interrogez la table et obtenez le dernier numéro de commande dont le préfixe est lié au contenu personnalisé et attribuez-le à @BILL_NO

select @BILL_NO = isnull(BILL_NO,0)
    FROM temp_bill 
    WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and
    SUBSTRING(BILL_NO,4,8) =@currentDate

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 : QNB20200615015

    Le numéro de commande généré est : QNB20200615016


  • 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 : Générer Le numéro de commande : QNB20200615001

    IF @BILL_NO !='' begin
     SET @lastno = str(right(@BILL_NO, 3)+1) ; 
     set @BILL_NO = @BILL_TYPE+@currentDate+RIGHT('000'+CAST(@lastno as varchar),3);
     end;ELSE  begin
     set @BILL_NO = @BILL_TYPE+@currentDate+CAST('001' as varchar(20));END;
  • En faisant cela, comme le serveur SQL n'a pas la fonction LPAD (il remplira automatiquement le nombre de chiffres spécifié), j'ai donc utilisé l'épissage de chaînes, puis utilisé correctement aller Récupérez les 3 chiffres à droite pour atteindre l'objectif (¯﹃¯), et c'est parti

5 Insérez le numéro de commande généré dans le tableau

Si pareil. Le numéro de commande existe dans le tableau, l'insertion dans le tableau échoue Si le même numéro de commande n'existe pas dans le tableau, l'insertion dans le tableau est réussie

insert into Temp_Bill(BILL_NO,BILL_TYPE) values(@BILL_NO ,@BILL_TYPE )

6. numéro de commande unique

Lorsque la commande est insérée avec succès dans le tableau, 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_NO as BILL_NO

4. Résultats d'exécution

1. Tout d'abord, 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 (20200615) + 001 (la première donnée , donc c'est 001)

C'est-à-dire :

QNB20200615001
2 Lorsque je le saisis pour la deuxième fois, en raison du Lorsqu'il y a des données, le dernier numéro de commande sera ajouté avec un suffixe de 1

, soit :

QNB20200615002

La haute concurrence du serveur SQL génère un numéro de commande unique 5. Anciennes règles

J'espère que cet article L'article pourra aider tout le monde

Si vous avez suffisamment de points, téléchargez-le directement. Si vous n'avez pas de points, tapez sur l'image. La quantité de code n'est pas grande de toute façon

Si vous êtes étudiant et n'avez pas de points, vous pouvez m'envoyer un message en privé et je vous l'enverrai gratuitement Code source
Lien de téléchargement du code : SQL server_getbillno.bak
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