SqlServer: 如何产生没有重复的报名编号

背景:

某一期的报名过程中,希望报名能做到报名从1开始,从小到大依次来。但实际生产环境中,用户集中大并发式报名,报名编号非常容易重复。

下面我们用简单的SQL来模拟和重现这个过程:

USE tempdb
GO
DROP TABLE IF EXISTS bm_data;
GO
CREATE TABLE bm_data(
	bmId INT IDENTITY(1,1) PRIMARY KEY,
	crId INT NOT NULL,
	regNo INT NOT NULL,
	addTime DATETIME NOT NULL	
)
GO
-- =============================================
-- Author:		yenange
-- Create date: 2024-06-04
-- Description:	测试报名
-- =============================================
CREATE OR ALTER PROCEDURE [dbo].[Proc_TestBm]
	@crId INT 
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @bmId INT=0,@errMsg NVARCHAR(512)=''
	
	BEGIN TRAN
	BEGIN TRY
		INSERT INTO bm_data
		(
			crId,
			regNo,
			addTime
		)
		SELECT 
			@crId,
 			(
 				SELECT ISNULL(MAX(b.regNo),0) + 1
 				FROM   bm_data AS b
 				WHERE  b.crId = @crId
 			) AS regno,
 			GETDATE()
		SET @bmId = SCOPE_IDENTITY();
		COMMIT TRAN;
	END TRY
	BEGIN CATCH
		SELECT @errMsg=ERROR_MESSAGE()
		ROLLBACK TRAN;
	END CATCH
	
	SELECT @bmId AS bmId, @errMsg AS errMsg
END
GO
--EXEC [dbo].[Proc_TestBm] @crId = 1
GO
--查询全部
SELECT * FROM [dbo].[bm_data]
--查询重复报名编号的记录
SELECT regNo,COUNT(1) AS cnt 
FROM [dbo].[bm_data] 
GROUP BY regNo
HAVING COUNT(1)>1

--TRUNCATE TABLE [bm_data]

模拟重现:

使用sql并发测试工具测试一下,重复10次,每次线程并发数50,总共500次。 

测试结果:有40个编号是重复的,其中还有2个编号是重复了3次。

解决方案:

-- =============================================
-- Author:		yenange
-- Create date: 2024-06-04
-- Description:	测试报名, 修正版
-- =============================================
CREATE OR ALTER PROCEDURE [dbo].[Proc_TestBm]
	@crId INT 
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @bmId INT=0,@errMsg NVARCHAR(512)='',@regNo INT=0
	
	BEGIN TRAN
	BEGIN TRY
		--先获取到报名编号
		SELECT @regNo=ISNULL(MAX(b.regNo),0) + 1
 		FROM   bm_data AS b WITH (ROWLOCK,XLOCK)
 		WHERE  b.crId = @crId
	
		INSERT INTO bm_data
		(
			crId,
			regNo,
			addTime
		)
		SELECT 
			@crId,
			@regNo,
 			GETDATE()
		SET @bmId = SCOPE_IDENTITY();
		COMMIT TRAN;
	END TRY
	BEGIN CATCH
		SELECT @errMsg=ERROR_MESSAGE()
		ROLLBACK TRAN;
	END CATCH
	
	SELECT @bmId AS bmId, @errMsg AS errMsg
END
GO

清空数据,再执行就是没有问题的了。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/677974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

城规跨考地信:你需要知道的几件事

24考研结束,25地信考研的小伙伴也开始准备。 在这期间发现一个现象,城规跨考GIS的讨论度非常高。 对这一点,我并不感到意外,因为随着地产行业的节节败退,很多单位不需要那么多规划人和建筑人,乃至土木人。…

【前端Vue3】——JQuery知识点总结(超详细)

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门知识专栏:🎇【MySQL&#…

ceph对象储存的使用

radosgw-admin user create --uid“user1” --display-name“user1” #创建用户 sudo apt install s3cmd cephadminceph-mgr01:~/ceph-cluster/s3$ s3cmd --configure Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed desc…

GPT-4o:人工智能新纪元的突破与展望

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

常见排序算法之插入排序

目录 一、直接插入排序 1.1 什么是插入排序 1.2 代码思路 1.3 C语言源码 二、希尔排序 2.0 插入排序的弊端 2.1 什么是希尔排序? 2.2 排序思路 2.3 C语言源码 一、直接插入排序 1.1 什么是插入排序 插入排序是一种简单直观的排序算法,它通过构…

Django视图层探索:GET/POST请求处理、参数传递与响应方式详解

系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游&#xff…

LeetCode刷题之HOT100之字母异位词分组

中午没有回宿舍午休,每次回去都没睡着,我想就没有必要回去了。京东买的书今天还没到,提前把题做了好专心做开发任务。 1、题目描述 2、逻辑分析 我看了几分钟,有点理解不了这道题需求是什么。看看题解。看了才理解题目的意思。字…

Java编程常见问题汇总四

系列文章目录 文章目录 系列文章目录前言一、忽略所有异常二、重复包装RuntimeException三、不正确的传播异常四、用日志记录异常五、异常处理不彻底 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

设计循环队列---力扣622

1、题目 1.1基础设置与讲解 循环队列,即固定长度的队列,可以想象成一个环形队列 就类似于这种队列,队尾指针后会有一个空位,用于控制判断队列为空还是为满; typedef int MyDataType;typedef struct {MyDataType fron…

弘君资本炒股开户:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关心的话题之一,面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇,弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态,股市是国民经济的晴雨表,股票价格…

03数据卷及其挂载的命令

数据卷(虚拟目录)操作命令 在容器内部修改文件 docker exec -it nginx bash: 进入Nginx容器内部 docker exec: 进入容器内部,容器内部会模拟一份阉割版的Linux文件系统,只包含镜像运行时所需的环境和配置以及文件-it: 给当前进入的容器创建一个标准输入/输出终端方便我们与容…

浏览器阻止屏幕息屏,js阻止浏览器息屏,Web网页阻止息屏

场景: 比如打开一个浏览器页面(比如大屏),想让它一直显示着,而不是过几分钟不操作就屏幕黑了.(电脑有设置电脑不操作就会多长时间就会息屏睡眠,如果要求每个客户都去操作一下电脑设置一下从不睡眠,这很不友好和现实.而且我也只想客户在大屏的时候才这样,其他页面就正常,按电脑设…

HTTPS缺失?如何轻松解决IP地址访问时的“不安全”警告

一、问题现象 如果访问网站时出现以下任何一种情况,则说明该网站需要立即整改: 1.浏览器地址栏那里出现“不安全”字样; 2.小锁标志被红叉()、斜线(\)等标志为不可用;…

二叉树的链式结构(二叉树)与顺序结构(堆)---数据结构

一、树的概念与结构 1、树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。我们常把它叫做树,是因为它看起来像一棵倒挂的树,它的根是朝上的,而叶是朝下的。 下面…

国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上Vim的详解03–使用Vundle插件管理器来安装和使用插件 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产操作系统上使用Vundle插件管理器来安装和使用Vim插件的详解文章。Vundle是Vim的一款强大的插…

【GD32H757Z海棠派使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

11.1 实验内容 通过本实验主要学习以下内容: SPI简介 GD32H7 SPI简介 SPI NOR FLASH——GD25Q128ESIGR简介 使用GD32H7 SPI接口实现对GD25Q128ESIGR的读写操作 11.2 实验原理 11.2.1 SPI简介 SPI(Serial Peripheral interface)&#…

Oracle和mysql中插入时间字段

例如有id 和 times两个字段 Oracle insert into xxx values|(1,sysdate) mysql insert into xxx values(1,now()) 在 MySQL 中,SYSDATE() 函数也是可用的,它与 NOW() 类似,但略有不同: NOW…

pdf文件怎么合并成一个文件

在现代办公环境中,PDF文件的使用已变得非常普遍。它们具有跨平台、易读性强的特点,因此被广泛应用于各种场合。然而,当需要处理大量的PDF文件时,如何有效地将它们合并成一个文件,成为了一个需要解决的问题。本文将详细…

STM 32_HAL_SDIO_SD卡

STM32的SDIO(Secure Digital Input Output) 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信,支持多媒体卡(MMC卡)、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…

High School Math 2003

高中数学2003,离我远去,有些已经忘记了 2个小时。选择题和填空题答题时间2-4分钟。基础题、应用题大题为10分钟左右,不然肯定就是没时间做完,数学就是考察就是2小时单位时间内完成数量和质量(正确率)&#…