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