高并发,保证订单号唯一
这是我在网上看来的。求大家验证
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
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
...全文
相关推荐
java web在高并发和分布式下实现订单号生成唯一的解决方案
主要介绍了java web在高并发和分布式下实现订单号生成唯一的解决方案,需要的朋友可以参考下
订单号的生成redis中获取
NULL 博文链接:https://yuhuiblog695685688425687986842568269.iteye.com/blog/2428458
JAVA生成唯一订单号[可运行源码]
本文详细介绍了JAVA中生成唯一订单号的几种常见方式,包括自增和随机两大类。自增方式涵盖纯数字自增、时间+数字自增以及数据库主键id自增,通过Redis和数据库实现。随机方式则包括随机数、UUID和分布式全局唯一id(雪花算法),分别使用Random、UUID和Snowflake工具实现。每种方法都提供了具体的代码示例和输出结果,帮助开发者根据业务需求选择合适的方式生成高效、安全、唯一的订单号。
利用asp.net实现生成不重复订单号
订单号在购物过程中起到了很好的识别作用,更方便的有利于工作人员识别商品,本文介绍利用asp.net实现生成订单号
JAVA生成订单号(日期+流水号)
java按日期加流水号方式生成订单号,已经测试过,可递增方式生成。


