一意の注文番号を生成するためのMySQLの高同時実行方法

一意の注文番号を生成するためのMySQLの高同時実行方法

序文

このブログ記事が公開された後、何人かの友人からSQL Serverバージョンがあるかどうか尋ねられました。現在は==》ポータルがあります

1. シーン再現

ERP 在庫管理システムや 0A などのシステムでは、複数の人が同時に注文番号を生成すると、複数の人が同じ注文番号を取得することが容易になり、会社のビジネスに回復不可能な損失が発生します。

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

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

ここに画像の説明を挿入

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

  • 書き込むことができます: テーブルに同一の注文番号がない場合、生成された注文番号がテーブルに書き込まれます
  • 書き込み不可: テーブル内に同じ注文番号が存在する場合、生成された注文番号をテーブルに書き込むことができず、注文番号を取得できないため、高い同時実行性でも一意の注文番号が生成されます。

3. 高い同時実行性のもとで一意の注文番号を生成するプロセス

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

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

ここに画像の説明を挿入

ステップ2: 注文番号を生成するストアドプロシージャを作成する

生成される注文番号の形式は、カスタムプレフィックス + 年、月、日 + サフィックス (001、002、003) です。
1. まずストアド プロシージャを作成します<br /> 入力は BILL_TYPE (プレフィックス)、出力は BILL_NOP (注文番号) です

CREATE DEFINER = CURRENT_USER PROCEDURE `getbillno`(BILL_TYPE VARCHAR(3) で、BILL_NOP varchar(25) で出力)
始める

2. 年、月、日、サフィックスを生成する<br /> 年、月、日は現在のシステム時刻で、サフィックスの初期値は 0 です

currentDate varCHAR (15) を宣言します。
lastno INT DEFAULT 0 を宣言します。
DATE_FORMAT(NOW(), '%Y%m%d') を currentDate に選択します。

3. テーブルをクエリして、テーブルの注文番号を取得します<br /> テーブルをクエリして、プレフィックスとカスタム コンテンツに関連する最新の注文番号を取得します

IFNULL(BILL_NO, 'notnull') を BILL_NOP に選択します
 temp_bill より 
 WHERE SUBSTRING(BILL_NO,1,3) = BILL_TYPEであり、
 SUBSTRING(BILL_NO,4,8) =現在の日付
 ORDER BY BILL_NO DESC LIMIT 1;

4. 注文番号を生成する

前の手順で取得した注文番号が空でない場合、新しく生成された注文番号は元の注文番号に +1 されます。

例: 取得した注文番号: UIE20200611015
生成された注文番号は次のとおりです: UIE20200611016

前の手順で取得した注文番号が空の場合、新しく生成された注文番号のサフィックスは001になります。
例: 生成された注文番号: UIE20200611001

BILL_NOP != '' の場合
 SET lastno = CONVERT(SUBSTRING(BILL_NOP, -3), DECIMAL); 
 選択 
 CONCAT(BILL_TYPE、currentDate、LPAD((lastno + 1)、3、'0')) を BILL_NOP に連結します。
それ以外
 選択 
 CONCAT(BILL_TYPE、currentDate、LPAD((lastno + 1)、3、'0')) を BILL_NOP に連結します。
終了の場合;

5. 生成された注文番号をテーブルに挿入します<br /> テーブルに同じ注文番号が存在する場合、テーブルへの挿入は失敗します。テーブルに同じ注文番号が存在しない場合は、テーブルへの挿入は成功します。

temp_bill に (BILL_NO、BILL_TYPE) VALUES (BILL_NOP、BILL_TYPE) を挿入します。

6. 一意の注文番号を返す<br /> 注文がテーブルに正常に挿入されると、一意の注文番号が返されます (前の手順が失敗した場合、この手順は実行されません)

BILL_NOPを選択します。

4. 運用結果

1. まず、テーブルにデータがないので、プレフィックス(UIEと入力)+年、月、日(
20200611)+001 (最初のデータなので001)
つまり: UIE20200611001

2 2回目に入力すると、テーブルにデータがあるため、最新の注文番号のサフィックスが1増加します
つまり: UIE20200611002

ここに画像の説明を挿入

5. 要約ではない要約

コードのダウンロードリンク: mysql_getbillno.sql

コードのスクリーンショット:

ここに画像の説明を挿入

これで、MySQL の高同時実行性を実装して一意の注文番号を生成する方法についての説明は終わりです。MySQL の高同時実行性を使用して一意の注文番号を生成する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離
  • MySQL マルチバージョン同時実行制御メカニズム (MVCC) ソースコードの詳細な説明
  • MySQLのMVCCマルチバージョン同時実行制御の実装
  • MySQL ロック制御同時実行方法
  • MySQL トランザクション同時実行問題の解決
  • MySQL データベースにおける高同時実行性の問題を解決する方法
  • MySQL 同時実行制御の原則に関する知識ポイント
  • MySQL マルチバージョン同時実行制御 MVCC の実装
  • MySQLデータの同時更新を処理する方法
  • Tomcat+Mysql の高同時実行構成の最適化の説明
  • MySQL はどのようにしてマルチバージョンの同時実行性を実現するのでしょうか?

<<:  HTML チュートリアル: DOCTYPE の省略形

>>:  CSS でのフィルタープロパティの使用に関する詳細な説明

推薦する

サーバー上でjupyterノートブックを実行する問題を解決する

目次サーバーはjupyterノートブックを実行します仮想環境次にファイアウォールをオフにしますJup...

Vue は、デスクトップから Web ページにファイルをドラッグするためのサンプル コードを実装します (画像/オーディオ/ビデオを表示できます)

効果使用する場合は、コードとスタイルを自分で最適化してください。画像を表示しない/ビデオとオーディオ...

CSS3で実装された天気アイコンのアニメーション効果

成果を達成する 実装コードhtml <div class="wrapper"...

MySQLカーソルの使い方と機能の詳細な説明

[mysqlカーソルの使い方と機能]例:現在、テーブル A、B、C の 3 つのテーブルがあります。...

データベースインデックスの知識ポイントの概要

目次ファーストルックインデックスインデックスの概念インデックスファイルの構成インデックスの役割SQL...

モバイルの赤い封筒の雨機能ページを実装するための JavaScript HTML

この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...

MySQL よく使われる関数の詳細な概要

目次MySQL 共通関数1. 数値関数文字列関数3. 時間機能4. システム機能5. 集計関数MyS...

バックエンドデータを取得するためのVue Elementフロントエンドアプリケーション開発

目次概要1. バックエンドデータの取得と処理2. インターフェース表示処理概要前回のエッセイ「ステッ...

Vue コンポーネントの切り替え、動的コ​​ンポーネント、コンポーネントのキャッシュについて

目次1. コンポーネント切り替え方式方法1: v-ifとv-elseを使用する方法 2: 組み込みコ...

MySQLでorder byを使用せずにランキングを実装する3つの方法のまとめ

ビジネスを想定: 2位の従業員の給与情報を見るデータベースを作成する emps が存在する場合はデー...

MySQLワームレプリケーションの基本知識

ワームは、その名前が示すように、自ら複製し、その数は倍増、つまり指数関数的に増加します。 MySQL...

MySQL 起動エラー 1067 および文字セットを変更して再起動した後の無効な回復

公式サイトからmysql-5.6.37-winx64.zipの解凍バージョンをダウンロードし、構成フ...

Vue3 で状態管理を実装するために provide を使用する方法

目次序文provide/inject を通じて Vuex 関数を実装する方法このプラグインをアプリケ...

MySQL タイムブラインドインジェクションの 5 つの遅延方法

MySQL タイム ブラインド インジェクションの 5 つの遅延方法 (PWNHUB の予期しない解...

ウェブページの読み込み速度を上げる簡単なヒント

Web ページの読み込み速度は、Web サイトの品質を評価するための重要な指標です。その理由は、ほと...