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
MSSQL 高并发下生成连续不重复的订单号的更多相关文章
- MSSQL高并发下生成连续不重复的订单号
一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...
- 采用redis生成唯一且随机的订单号
项目描述 最近做的一个项目有这么一个需求:需要生成一个唯一的11位的就餐码(类似于订单号的概念),就餐码的规则是:一共是11位的数字,前面6位是日期比如2019年07月20就是190720,后面五位是 ...
- 分布式高并发下全局ID生成策略
数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 1 不能有单点故障. 2 以时间为序,或者ID里包含时间 ...
- 海量数据和高并发下的 Redis 业务优化实践
本文内容是我在 6 月 23 日参加的深圳 GIAC 技术大会上演讲的文字稿. 观众朋友们,我是来自掌阅的工程师钱文品,掘金小册<Redis 深度历险>的作者.今天我带来的是分享主题是:R ...
- Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解
Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解 说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返 ...
- Java高并发下多线程编程
1.创建线程 Java中创建线程主要有三种方式: 继承Thread类创建线程类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此也把run方法称为 ...
- php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
- (高级篇)php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
- php结合redis实现高并发下的抢购、秒杀功能 (转载)
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个: 1 高并发对数据库产生的压力 2 竞争状态下如何解决库存的正确减少("超卖"问题) 对于第一个问题,已经很容易想到 ...
随机推荐
- shell-变量的数值运算与特殊应用expr
1. expr(evaluate expressions)命令的用法: expr命令一般用于整数值,当也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器. 语法:expr ex ...
- git-代码分支管理
1. git代码分支管理 DEV SIT UAT PET PRE PRD PROD常见环境英文缩写含义 英文缩写 英文 中文 DEV development 开发 SIT System Int ...
- package.json文件配置说明
1.什么是package.json package.json文件是Node.js项目中的一个描述文件,执行npm init命令初始化项目后,在项目的根目录下自动生成该文件.package.json包含 ...
- SessionStorage、LocalStorage详解
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/sessionstorage-and-localst ...
- Nuxt+Vue聊天室|nuxt仿微信App界面|nuxt.js聊天实例
一.项目简述 nuxt-chatroom 基于Nuxt.js+Vue.js+Vuex+Vant+VPopup等技术构建开发的仿微信|探探App界面社交聊天室项目.实现了卡片式翻牌滑动.消息发送/emo ...
- GIT之分支管理
分支管理 一.分支推进 主分支 单线分支,随着代码的提交而形成的一条直线,HEAD 随着commit提交之后的节点移动而移动. 子分支 当切换到子分支的时候,HEAD 则指向子分支的节点. 在子分支上 ...
- errno线程安全性
errno errno用于获取系统最后一次出错的错误代码.在C++中,errno其实是宏: // windows #define errno (*_errno()) // linux #define ...
- abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...
- html中object标签
首先将这个强大web页面打印例子(pintTest.html)贴上来. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional ...
- BERT模型详解
1 简介 BERT全称Bidirectional Enoceder Representations from Transformers,即双向的Transformers的Encoder.是谷歌于201 ...