首页 新闻 会员 周边

我写的通用流水号生成器,帮忙看看有没有问题

0
悬赏园豆:30 [待解决问题]

我系统中有很多需要生成流水号的地方,比如出库单、入库单等,每天的流水号自动复位为0,为此我写了一个存储过程。
首先建一个表
--SeqName是序号的名字,SeqDate是日期,CurValue是当前的值
create table T_DailySeqNo(id bigint identity,SeqName nvarchar(50),SeqDate datetime,CurValue int)

例子数据:
2 入库单 2011-5-7 0:00:00 102
3 出库单 2011-5-9 0:00:00 30

存储过程:
create procedure usp_getSeqNo
(
@SeqName nvarchar(50),
@result int output
)
AS
BEGIN
BEGIN TRAN 
--更新当天的流水号+1(可能不存在)
Update T_DailySeqNo set CurValue=CurValue+1
where SeqName=@SeqName and DATEDIFF(day,SeqDate,getdate())=0
--取得数据库中是否有当天的序列号
DECLARE @todaycount int 
select @todaycount=count(*) from T_DailySeqNo 
where SeqName=@SeqName and DATEDIFF(day,SeqDate,getdate())=0
if @todaycount<=0
begin
--如果数据库中没有当前序列号数,则插入初始值1
insert into T_DailySeqNo(SeqName,SeqDate,CurValue)
values(@SeqName,convert(varchar(10),getdate(),20),0)
end
--取得最大的序号数
select @result=Max(CurValue) from T_DailySeqNo 
where SeqName=@SeqName and DATEDIFF(day,SeqDate,getdate())=0
COMMIT 
END

调用测试
declare @result int
exec usp_getSeqNo '入库单',@result output
select @result

我对锁不太熟悉,不知道会不会有并发问题,我写了一个程序启动三个线程同时执行,都没有重复生成流水号的。但是由于没有高人的指点,还是不放心。
请高人看一下这个有没有并发问题,以及能否继续改进。

c716510的主页 c716510 | 初学一级 | 园豆:160
提问于:2011-05-09 13:24
< >
分享
所有回答(1)
0

1你可以做一个job 每天0点自动把CurValue设成0

死白的man | 园豆:2135 (老鸟四级) | 2011-05-09 22:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册