主要思路:当生产流水号时,需要对当期的流水号进行锁定,可以自己用流程处理,也可以直接交给数据库处理,
下面的例子是用update语句给表test SN进行锁定,这样其他的线程访问的时候必须等本线程事务提交,所以避免了重复流水号的生产。
testSN
create table testSN(id int,typename char(20))
go
insert into testSN values (100,'YYLSH')
go
create proc createSN
as
begin
set nocount on
declare @sn table(id int)
declare @snChar varchar(20)
begin tran
update testSN
set id=id+1
output deleted.id into @sn
where typename='YYLSH'
if(@@ERROR=0)
begin
commit
select @snChar=id from @sn
print @snChar
end
else
rollback
end
测试代码,可以多开几个窗口同时执行,看是否会抛出重复序列号。
我开了3个窗口同时执行,没有重复。
declare @i int
set @i=0
while @i<10000
begin
exec createSN
set @i=@i+1
end