>  기사  >  데이터 베이스  >  SQL Server의 높은 동시성으로 고유한 주문 번호가 생성됩니다.

SQL Server의 높은 동시성으로 고유한 주문 번호가 생성됩니다.

藏色散人
藏色散人앞으로
2020-08-29 12:01:382645검색

머리말

몇일 전, MySQL에서 동시성이 높은 고유 주문 번호를 생성하는 방법에 대한 기사를 누군가가 SQL 서버 버전이 있는지 묻는 개인 메시지를 보냈습니다. 오늘 정오에는 SQL 서버 버전의 높은 동시성에 대해 특별히 글을 썼습니다. 고유 주문 번호 생성 구현은 실제로 MySQL 및 SQL 서버의 구현과 동일합니다. 주된 이유는 일부 구문이 약간 다르기 때문입니다. 따라서 내 기사의 텍스트 설명은 거의 동일하고 코드와 인터페이스만 다르다는 것을 알 수 있습니다.

추천: "SQL Tutorial"

1. 장면 재현

ERP 구매, 판매 및 재고 시스템이나 0A와 같은 다른 시스템에서 여러 사람이 동시에 주문 번호 생성 작업을 수행하면 여러 사람이 동일한 결과를 얻기 쉽습니다. 하나의 주문 번호는 회사 비즈니스에 돌이킬 수 없는 손실을 초래할 수 있습니다.

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

저장 프로시저와 데이터 테이블을 사용하여 테이블을 생성하고 저장 프로시저와 저장 프로시저를 생성합니다. 주문 번호 생성을 담당하고, 테이블은 고유성 문제 처리를 담당합니다.
SQL Server의 높은 동시성으로 고유한 주문 번호가 생성됩니다.
저장 프로시저가 주문 번호를 생성하면 먼저 테이블에 주문 번호를 쓴 후 표시합니다. 주문 번호 결과 생성된 주문 번호를 테이블에 기록합니다. 두 가지 상황이 발생합니다. 이유는 무엇입니까? 테이블에 기본 키(기본 키 고유성)가 있으므로

  • 에 쓸 수 있습니다. 테이블에 동일한 주문 번호가 없으면 생성된 주문 번호가 테이블에 기록됩니다.

  • 에 쓸 수 없습니다. 테이블에 동일한 주문번호가 존재하는 경우, 즉 생성된 주문번호를 테이블에 쓸 수 없고, 주문번호를 얻을 수 없어 높은 동시성으로 고유한 주문번호가 생성되는 것을 보장

3. 높은 동시성에서 고유 주문 번호를 생성하는 과정

다음에서는 코드와 실제 작업을 사용하여 고유 주문 번호를 생성하는 과정을 설명합니다
1단계: 데이터 테이블을 생성하고 주문 번호 필드를 기본 키로 설정합니다( 고유 주문 번호의 핵심)
SQL Server의 높은 동시성으로 고유한 주문 번호가 생성됩니다.
2단계: 주문 번호를 생성하는 저장 프로시저 만들기
주문 번호 생성 형식은 맞춤 접두사 + 연, 월, 일 + 접미사(001, 002)입니다. , 003)
1. 먼저 저장 프로시저를 만듭니다
매개변수는 @BILL_TYPE

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

2. 연, 월, 일 및 접미사를 생성합니다.
연, 월, 일은 현재 시스템 시간이며 초기값입니다. suffix 값은 ​​0

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

3. 테이블을 쿼리하여 테이블의 주문 번호를 가져옵니다
테이블을 쿼리하여 사용자 정의 콘텐츠와 관련된 접두어를 가져오고 최신 주문 번호를 @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. 주문 번호 생성

  • 이전 단계에서 얻은 주문 번호가 비어 있지 않은 경우 새로 생성된 주문 번호는 원래 주문 번호에 +1이 됩니다

    예: 얻은 주문 번호: QNB20200615015
    생성된 주문 번호는 QNB20200615016

  • 이전 단계에서 얻은 주문 번호가 비어 있는 경우 새로 생성된 주문 번호의 접미사는 001

    예: 생성된 주문 번호: 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;

때 이렇게 하고 있었는데 SQL 서버에 LPAD 기능이 없어서(지정된 숫자보다 작은 자릿수는 자동으로 채워짐) 스트링 스플라이싱을 사용한 뒤 오른쪽에 있는 3자리를 얻어와서 달성했습니다.

5. 생성된 주문번호를 테이블에 삽입하세요
테이블에 동일한 주문번호가 있으면 테이블 삽입에 실패합니다
동일한 주문번호가 있으면 테이블에 삽입되지 않습니다. 테이블에 없으면 테이블 삽입 성공

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

6. 고유 주문 번호 반환
시 주문이 테이블에 성공적으로 삽입되면 고유 주문 번호가 반환됩니다(이전 단계에서 실패하면 이 단계는 실행되지 않습니다)

select @BILL_NO as BILL_NO

4. 실행 결과

1. 우선 내 테이블에는 데이터가 없으며 접두사(I 입력: UIE) + 연, 월, 일(20200615) + 001 (첫 번째 데이터이므로 001)
즉, QNB20200615001

2 두 번째 입력할 때 테이블에 데이터가 있기 때문에 최신 주문 번호 접미사 플러스를 기준으로 합니다. 1
은: QNB20200615002
SQL Server의 높은 동시성으로 고유한 주문 번호가 생성됩니다.

5. 이전 규칙

이 기사가 모든 사람에게 도움이 되기를 바랍니다
포인트가 충분하다면 직접 다운로드하세요. 어쨌든 사진을 입력하세요. , 코드 금액은 크지 않습니다
학생이고 포인트가 없는 경우 저에게 개인적으로 채팅하시면 무료로 소스 코드를 보내드립니다
코드 다운로드 링크: SQL server_getbillno.bak
코드 스크린샷:
SQL Server의 높은 동시성으로 고유한 주문 번호가 생성됩니다.

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

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