ホームページ  >  記事  >  データベース  >  MySQL の高い同時実行性により固有の注文番号が生成される

MySQL の高い同時実行性により固有の注文番号が生成される

藏色散人
藏色散人転載
2020-08-29 11:59:213917ブラウズ

##まえがき

このブログ投稿が公開された後、友人から

はないか尋ねられました。 SQL サーバー バージョン には、「SQL サーバーによる一意の注文番号の高同時生成

推奨: 「

mysql チュートリアル

が追加されました。一、シーン再現

ERP購買・販売・在庫システムや0Aなどのシステムでは、複数人が同時に注文番号を生成する作業を行うと、簡単に複数人が注文番号を取得することができます。取り返しのつかない損失を引き起こす

2. 注文番号が一意ではない同時実行性の高い状況を回避する方法

ストアド プロシージャとデータ テーブルを使用して、テーブルを作成し、ストアド プロシージャを作成します。ストアド プロシージャは注文番号の生成を担当し、テーブルは一意性の問題の処理を担当します。


MySQL の高い同時実行性により固有の注文番号が生成される

ストアド プロシージャが注文番号を生成するときは、最初に注文番号をテーブルに書き込み、注文番号の結果を表示し、生成する 注文番号をテーブルに書き込むと、2 つの状況が発生します。なぜですか?テーブルには主キー (主キーの一意性) があるため、

# と書くことができます。 テーブル内に同じ注文番号がない場合、生成された注文番号がテーブルに書き込まれます
  • 書き込めない: テーブル内に同じ注文番号が存在する場合、つまり、生成された注文番号をテーブルに書き込むことができず、注文番号を取得できないため、高い同時実行性で一意の注文番号が生成されることが保証されます
  • 3. 高い同時実行性で一意の注文番号を生成するプロセス

#以下では、コードと実際の操作を使用して一意の注文番号を生成するプロセスについて説明します

最初のステップ: データ テーブルを作成し、注文番号フィールドを主キー (一意の注文番号へのキー) に設定します。

MySQL の高い同時実行性により固有の注文番号が生成されるステップ 2: ストアド プロシージャを作成して、注文番号の生成

生成される注文番号の形式は次のとおりです: プレフィックス年、月、日のサフィックス (001、002、003) をカスタマイズします

1. まずストアド プロシージャ ## を作成します。
#入力は BILL_TYPE (プレフィックス)、出力は BILL_NOP (注文番号)

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

2. 年、月、日、およびサフィックスを生成します

年、月日は現在のシステム時刻、サフィックスの初期値は 0

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

3 テーブルをクエリしてテーブルの順序番号を取得します

クエリテーブルを参照して、カスタム コンテンツ

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 に関連するプレフィックスが付いた最新の注文番号を取得します。注文番号を生成します

注文の場合前の手順で取得した番号が空ではない場合、新しく生成される注文番号は元の注文番号 1
  • 例: 取得された注文番号: UIE20200611015

    生成される注文番号: UIE20200611016


    #前の手順で取得した注文番号が空の場合、新しく生成される注文番号のサフィックスは 001

    例: 生成される注文番号: 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. 生成された注文番号をテーブルに挿入します

  • 同じ
注文番号がテーブルに存在する場合、テーブルへの挿入は失敗します

If テーブル内に同じ 注文番号が存在しない場合、テーブルへの挿入は成功します

INSERT INTO temp_bill (BILL_NO, BILL_TYPE) VALUES (BILL_NOP,BILL_TYPE) ;
6。注文が挿入されると、一意の注文番号を返します
(上記の 1 つのステップが失敗した場合、このステップは実行されません)
SELECT   BILL_NOP;
4. 実行結果

1. 最初のすべて、テーブルにはデータがありません。プレフィックスが生成されます (UIE と入力しました) 年と月 日 (20200611) 001 (最初のデータなので 001)
は:

UIE20200611001

2 二度目に入力すると、テーブルにデータがあるため、最新の注文番号に基づいて 1
のサフィックスが追加されます。つまり、
UIE20200611002


# 5. 要約ではない要約

謙虚な新人の自己報告:

MySQL の高い同時実行性により固有の注文番号が生成されるこの記事が皆さんのお役に立てれば幸いです

十分なポイントがある場合は、直接ダウンロードしてください。ポイントがない場合は、画像を入力するだけです。コードの量はとにかく多くありません

もしあなたがそうであれば学生でポイントをお持ちでない場合は、私とプライベートにチャットしていただければ、ソース コードを無料でお送りします

コードのダウンロード リンク: mysql_getbillno.sqlコードのスクリーンショット:


以上がMySQL の高い同時実行性により固有の注文番号が生成されるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。