在有的业务场景中,需要生成连续的流水号,如果不考虑其他情况,比如数据库迁移、最后一条被删除等,可以直接使用自增字段;如果要考虑以后的数据迁移,可以用这种方法:
首先有一张表,记录最大ID,每次生成流水号的时候,都是先从这张表中取出最大ID,之后+1更新:
如:
declare @serial_number int;
set @serial_number=0;
update tb1 set @serial_number=maxid,maxid=maxid+1;
这里使用update,利用的是SQL Server的更新锁,就不需要自建锁影响性能。
如果后续使用该流水号时失败,就需要整个回滚,再加个事务:
declare @serial_number int,@status int;
set @serial_number=0;
set @status=0;
begin tran tran_serial:
begin try
update tb1 set @serial_number=maxid,maxid=maxid+1;
--其他业务逻辑
insert into t_serial (serial_number) values (@serial_number);
set @status=1;
end try
begin catch --出现异常,回滚事务
rollback tran tran_serial;
end catch
if(@status=1)
begin --如果执行成功没有发生异常,提交整个事务
commit tran tran_serial;
end
以上。
本文作者:老徐
本文链接:https://bigger.ee/archives/generate-serial-number-in-sql-server-database.html
转载时须注明出处及本声明
One comment
感谢分享
深入学习