当前位置: 代码迷 >> Sql Server >> 关于生成不重复流水号的有关问题…
  详细解决方案

关于生成不重复流水号的有关问题…

热度:52   发布时间:2016-04-24 10:03:05.0
关于生成不重复流水号的问题……
最近在网上查了很多关于生成流水号的方法,得到的答案都跟下面类同,都是先更新后查询,如下:

假设你就是使用SQL Server,以它的默认事务控制级别,可以确保不会进行脏读。那么你可以为每一个业务表单独设计一个“流水号”表,这个表只有一列字段,而且只有一行,保存了最大流水号。当你写一个业务记录时,在同一个事务中,为流水号+1,并将新的流水号写入业务数据记录,然后事务才结束。在事务结束之前,读取同一个流水号表最大流水号的其它事务会等待。


我想问问这样做的效率好,还是直接在事务中把事务隔离级别设成SERIALIZABLE,然后先查询再加1的效率好,区别是一样吗? 
------解决方案--------------------
个人感觉效果是一样的,前者的做法也是以排它锁的方式防止并发,序列化可以达到同样的效果。
------解决方案--------------------
之前了解到,在java hibernate中好像有通过一个表,一条记录,N个字段,每个字段对应一个表,里面存储了这个表中 当前最大的字段,我觉得是否可以考虑用这个方法来实现。
------解决方案--------------------
这个表只有一列字段,而且只有一行,保存了最大流水号.当你写一个业务记录时,在同一个事务中,为流水号+1


这个方法不错 直接用默认的就可以了
------解决方案--------------------
通过函数可以这样实现
--下面的代码生成长度为的编号,编号以BH开头,其余位为流水号。
--得到新编号的函数
CREATE FUNCTION f_NextBH()
RETURNS char(8)
AS
BEGIN
RETURN(SELECT 'BH'+RIGHT(1000001+ISNULL(RIGHT(MAX(BH),6),0),6) FROM tb WITH(XLOCK,PAGLOCK))
END
GO

--在表中应用函数
CREATE TABLE tb(
BH char(8) PRIMARY KEY DEFAULT dbo.f_NextBH(),
col int)

--插入资料
BEGIN TRAN
INSERT tb(col) VALUES(1)
INSERT tb(col) VALUES(2)
INSERT tb(col) VALUES(3)
DELETE tb WHERE col=3
INSERT tb(col) VALUES(4)
INSERT tb(BH,col) VALUES(dbo.f_NextBH(),14)
COMMIT TRAN

--显示结果
SELECT * FROM tb
  相关解决方案