关于生成并发唯一性流水号的解决方案
2015-04-07 17:24
495 查看
1、表结构和效果图,这个表是用来存储基础因子的,需要的可以拓展字段,比如,升序,降序,起始序号等。
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]
2、存储过程代码
1
Create procedure [dbo].[GetSerialNo]
2
(
3
@sCode varchar(50)
4
)
5
6
as
7
8
--exec GetSerialNo
9
10
begin
11
12
Declare @sValue varchar(16),
13
14
@dToday datetime,
15
16
@sQZ varchar(50) --这个代表前缀
17
18
Begin Tran
19
20
BeginTry
21
22
--锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
23
--在同一个事物中,执行了update语句之后就会启动锁
24
UpdateSerialNo setsValue=sValue wheresCode=@sCode
25
26
Select @sValue =sValue FromSerialNo wheresCode=@sCode
27
28
Select @sQZ =sQZ FromSerialNo wheresCode=@sCode
29
30
--因子表中没有记录,插入初始值
31
32
If @sValue is null
33
34
Begin
35
36
Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001')
37
38
UpdateSerialNo setsValue=@sValue wheresCode=@sCode
39
40
end else
41
42
Begin --因子表中没有记录
43
44
Select @dToday = substring(@sValue,1,6)
45
46
--如果日期相等,则加1
47
48
If @dToday = convert(varchar(6), getdate(), 12)
49
50
Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))
51
52
else --如果日期不相等,则先赋值日期,流水号从1开始
53
54
Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001')
55
56
57
58
UpdateSerialNo setsValue =@sValue wheresCode=@sCode
59
60
End
61
62
Selectresult = @sQZ+@sValue
63
64
Commit Tran
65
66
EndTry
67
68
BeginCatch
69
70
Rollback Tran
71
72
Selectresult = 'Error'
73
74
EndCatch
75
76
end
77
78
请注明出处[小虎原创]:http://www.52rs.net/ArticleView.aspx?gID=71bd9b1d-ad30-4f6e-896d-fed7dfbc1b3d
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]
2、存储过程代码
1
Create procedure [dbo].[GetSerialNo]
2
(
3
@sCode varchar(50)
4
)
5
6
as
7
8
--exec GetSerialNo
9
10
begin
11
12
Declare @sValue varchar(16),
13
14
@dToday datetime,
15
16
@sQZ varchar(50) --这个代表前缀
17
18
Begin Tran
19
20
BeginTry
21
22
--锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了
23
--在同一个事物中,执行了update语句之后就会启动锁
24
UpdateSerialNo setsValue=sValue wheresCode=@sCode
25
26
Select @sValue =sValue FromSerialNo wheresCode=@sCode
27
28
Select @sQZ =sQZ FromSerialNo wheresCode=@sCode
29
30
--因子表中没有记录,插入初始值
31
32
If @sValue is null
33
34
Begin
35
36
Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + '000001')
37
38
UpdateSerialNo setsValue=@sValue wheresCode=@sCode
39
40
end else
41
42
Begin --因子表中没有记录
43
44
Select @dToday = substring(@sValue,1,6)
45
46
--如果日期相等,则加1
47
48
If @dToday = convert(varchar(6), getdate(), 12)
49
50
Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))
51
52
else --如果日期不相等,则先赋值日期,流水号从1开始
53
54
Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +'000001')
55
56
57
58
UpdateSerialNo setsValue =@sValue wheresCode=@sCode
59
60
End
61
62
Selectresult = @sQZ+@sValue
63
64
Commit Tran
65
66
EndTry
67
68
BeginCatch
69
70
Rollback Tran
71
72
Selectresult = 'Error'
73
74
EndCatch
75
76
end
77
78
请注明出处[小虎原创]:http://www.52rs.net/ArticleView.aspx?gID=71bd9b1d-ad30-4f6e-896d-fed7dfbc1b3d
相关文章推荐
- 转载:关于生成并发唯一性流水号的解决方案
- 今天看见虎姐写的关于生成并发唯一性流水号的解决方案
- 关于生成并发唯一性流水号的解决方案
- 关于生成并发唯一性流水号的解决方案
- 关于生成并发唯一性流水号的解决方案
- 关于生成并发唯一性流水号的解决方案
- 关于生成并发唯一性流水号的解决方案
- 关于生成并发唯一性流水号的解决方案
- 关于SQL SERVER高并发解决方案
- 关于高负载高并发的服务器端应用,java解决方案(二)
- 请教关于pdf2swf在linux上生成swf文件的解决方案
- 关于生成订单号的解决方案
- [转]关于生成订单号的解决方案 -- 较好的解决方案
- 关于.NET解决方案批生成的一点探索(同一个解决方案下多项目批生成)
- 关于流水帐表序列号生成时的并发操作问题
- 关于生成订单号的解决方案PHP
- WCF关于svcutil生成关于绑定出现 元数据包含无法解析的引用的解决方案
- 关于生成订单号的解决方案PHP
- 关于Gridview自动生成列后,手动设定的模板列位置问题解决方案
- 关于高负载高并发的服务器端应用,java解决方案(一)