MSSQL 高并发下生成连续不重复的订单号

参考:

https://www.cnblogs.com/h-change/p/6699683.html

 这里在数据库层面生成的,经测试确实不会重复。

附上自己修改后的版本,这里也可以预先生成一年的记录,过程就可以直接去读取。认为表里是一定有数据的。

--表结 rq date num int 记录每一天生成了多个单号 用于生成流水的

GO
CREATE PROC dbo.proc_CreateNewDH
AS 
    SET NOCOUNT ON
    DECLARE
        @TranCount INT=0,
        @Error INT=0,
        @MaxNum INT=0,
        @ErrorMsg VARCHAR(MAX),
        @rq DATE=CONVERT(VARCHAR(10), GETDATE(), 121)    
    BEGIN TRY
    
    BEGIN TRAN
        SET @TranCount=1
        
        SELECT @MaxNum=Num+1
        FROM dhlist WITH(ROWLOCK, UPDLOCK)  --索引当前行不让其他人编辑
        WHERE rq=@rq
        SET @MaxNum=ISNULL(@MaxNum,0)    
        IF @MaxNum=0
        BEGIN
            INSERT INTO dbo.dhlist (rq,Num) VALUES(@rq, 1)
            SET @MaxNum=1
        END
        ELSE
            UPDATE dhlist  SET Num=Num+1 WHERE rq=@rq        
    END TRY
    BEGIN CATCH 
    
        SET @Error=@@ERROR
        SET @ErrorMsg=ERROR_MESSAGE()
        IF @TranCount=1
        BEGIN            
            ROLLBACK TRAN    
            --PRINT 'ROLLBACK TRAN'
            --PRINT @Error
            --PRINT @TranCount
        END
        RAISERROR(@ErrorMsg, 19, 1)     WITH LOG
        RETURN
    END CATCH    
        
    IF @TranCount=1 AND @Error=0
        COMMIT TRAN
        
    IF LEN(CAST(@MaxNum AS VARCHAR))<=4
        SELECT 'XXX'+CONVERT(VARCHAR,GETDATE(),12)+RIGHT('0000'+CAST(@MaxNum AS VARCHAR), 4) AS dh
    ELSE
        SELECT 'XXXX'+CONVERT(VARCHAR,GETDATE(),12)+RIGHT('000000'+CAST(@MaxNum AS VARCHAR), 6) AS dh

    SET NOCOUNT OFF
GO
原文地址:https://www.cnblogs.com/BTag/p/12674858.html