高并发,保证订单号唯一

lmc19860810 lmc19860810 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
这是我在网上看来的。求大家验证

CREATE TABLE [dbo].[SerialNo](
[sCode] [varchar](50) NOT NULL,--主键也是多个流水号的类别区分
[sName] [varchar](100) NULL,--名称,备注形式
[sQZ] [varchar](50) NULL,--前缀
[sValue] [varchar](80) NULL,--因子字段
CONSTRAINT [PK_SerialNo] PRIMARY KEY CLUSTERED
(
[sCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,

ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


==========================================================================

Create procedure [dbo].[GetSerialNo]
(
@sCode varchar(50)
)

as

--exec GetSerialNo

begin

Declare @sValue varchar(16),

@dToday datetime,

@sQZ varchar(50) --这个代表前缀

Begin Tran

Begin Try

-- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
--在同一个事物中,执行了update语句之后就会启动锁
Update SerialNo set sValue=sValue where sCode=@sCode

Select @sValue = sValue From SerialNo where sCode=@sCode

Select @sQZ = sQZ From SerialNo where sCode=@sCode

-- 因子表中没有记录,插入初始值

If @sValue is null

Begin

Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001')

Update SerialNo set sValue=@sValue where sCode=@sCode

end else

Begin --因子表中没有记录

Select @dToday = substring(@sValue,1,6)

--如果日期相等,则加1

If @dToday = convert(varchar(6), getdate(), 12)

Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))

else --如果日期不相等,则先赋值日期,流水号从1开始

Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001')



Update SerialNo set sValue =@sValue where sCode=@sCode

End

Select result = @sQZ+@sValue

Commit Tran

End Try

Begin Catch

Rollback Tran

Select result = 'Error'

End Catch

end
...全文

相关推荐

评论 9
收藏 已收藏
分享
返回顶部
lmc19860810
.NET社区 62,273 成员 668,968 内容