>  기사  >  데이터 베이스  >  MySQL 높은 동시성은 고유한 주문 번호를 생성합니다.

MySQL 높은 동시성은 고유한 주문 번호를 생성합니다.

藏色散人
藏色散人앞으로
2020-08-29 11:59:213917검색

머리말

이 블로그 글이 올라간 후 친구가 SQL 서버 버전이 있냐고 물어보더군요. 지금은 "SQL 서버 고동시성 고유 주문 번호"

가 있습니다. : " mysql tutorial

1. 장면 재현

ERP 구매, 판매, 재고 시스템이나 0A와 같은 기타 시스템에서 주문 번호 생성 작업을 여러 사람이 동시에 수행하면 여러 사람이 동일한 주문 번호를 획득하여 회사 비즈니스에 돌이킬 수 없는 손실을 초래함

2. 주문 번호가 고유하지 않은 높은 동시성 상황을 피하는 방법

저장 프로시저와 데이터 테이블을 사용하여 테이블을 만들고 저장 항목을 생성할 수 있습니다. 프로시저는 주문 번호 생성을 담당합니다. 테이블은 고유성 문제를 처리합니다.
MySQL 높은 동시성은 고유한 주문 번호를 생성합니다.

저장 프로시저가 주문 번호를 생성하면 먼저 주문 번호가 테이블에 기록되고 그 다음에 주문 번호 결과가 기록됩니다. 생성된 주문 번호가 테이블에 기록되면 두 가지 상황이 발생합니다. 이유는 무엇입니까? 테이블에 기본 키(기본 키 고유성)가 있으므로

  • 쓸 수 있음: 테이블에 동일한 주문 번호가 없는 경우, 즉 생성된 주문 번호가 테이블에 기록됩니다.
  • 쓸 수 없는 경우: 테이블에 동일한 주문 번호가 존재합니다. 주문 번호, 즉 생성된 주문 번호를 테이블에 쓸 수 없고, 주문 번호를 얻을 수 없으므로 높은 동시성에서 고유한 주문 번호가 생성됩니다

3. 높은 동시성에서 고유 주문 번호를 생성하는 프로세스

다음은 코드와 실제 작업을 사용하여 고유 주문 번호를 생성하는 프로세스를 설명합니다

1단계: 데이터 테이블을 생성하고 주문 번호 필드를 기본 키로 설정합니다. (고유한 주문 번호의 핵심)

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 연도, 월, 일 및 접미사
를 생성합니다. day는 현재 시스템 시간이고 접미사의 초기값은 ​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. 생성된 주문 번호를 테이블에 삽입합니다
테이블에 동일한 주문 번호가 있으면 테이블에 삽입이 실패합니다.테이블에 동일한
주문 번호가 없으면 삽입이 실패합니다. 테이블이 성공했습니다

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

6. 고유 주문 번호 반환

주문이 테이블에 성공적으로 삽입되면 고유 주문 번호가 반환될 수 있습니다. (이전 단계가 실패할 경우 이 단계는 실행되지 않습니다.)

SELECT   BILL_NOP;

4. 실행 결과

1. 우선 테이블에 데이터가 없습니다. 접두어(입력한 내용: UIE) + 연, 월, 일(

20200611) + 001(첫 번째 데이터)이 생성됩니다. 001)

즉:
UIE20200611001
2 두 번째 입력할 때 테이블 때문에 데이터가 있으면 최신 주문 번호의 접미사에 1이 추가됩니다. 즉:

UIE20200611002


5. 요약이 아닌 요약MySQL 높은 동시성은 고유한 주문 번호를 생성합니다.

겸손한 신인의 자기소개:

이 글이 도움이 되었으면 좋겠습니다포인트가 충분하다면 다운받으세요. 포인트가 없으니 사진을 입력해 보세요. 어쨌든 코드 양은 많지 않습니다학생이고 포인트가 없으신 분들은 개인적으로 메시지를 보내주시면 무료로 소스코드를 보내드리겠습니다

코드 다운로드 링크: mysql_getbillno .sql
코드 스크린샷:


위 내용은 MySQL 높은 동시성은 고유한 주문 번호를 생성합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제