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

cmd201314 2014-08-29 03:14:22
最近在网上查了很多关于生成流水号的方法,得到的答案都跟下面类同,都是先更新后查询,如下:

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


我想问问这样做的效率好,还是直接在事务中把事务隔离级别设成SERIALIZABLE,然后先查询再加1的效率好,区别是一样吗?
...全文
688 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmd201314 2014-08-31
  • 打赏
  • 举报
回复
继续等待中!
cmd201314 2014-08-31
  • 打赏
  • 举报
回复
我想问问这样做的效率好,还是直接在事务中把事务隔离级别设成SERIALIZABLE,然后先查询再加1的效率好,区别是一样吗? 都没有人看清楚就回答
霜寒月冷 2014-08-31
  • 打赏
  • 举报
回复
通过函数可以这样实现
--下面的代码生成长度为的编号,编号以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
autumn117 2014-08-30
  • 打赏
  • 举报
回复
请文章 SqlServer数据库,并发运行,获取唯一流水号 http://blog.chinaunix.net/uid-20680669-id-4422973.html
cmd201314 2014-08-30
  • 打赏
  • 举报
回复
把事务隔离级别设成SERIALIZABLE,然后在同一个事务中先查询再加1,这样不是一样吗?
--小F-- 2014-08-29
  • 打赏
  • 举报
回复
这个表只有一列字段,而且只有一行,保存了最大流水号.当你写一个业务记录时,在同一个事务中,为流水号+1 这个方法不错 直接用默认的就可以了
中国风 2014-08-29
  • 打赏
  • 举报
回复
最好用一表记录已取最后单号,下次取号时+1
xiaodongni 2014-08-29
  • 打赏
  • 举报
回复
感觉流水号这种 一般不是用时间加业务类型加店号啥的 这种不就能保证不重复吗
LongRui888 2014-08-29
  • 打赏
  • 举报
回复
之前了解到,在java hibernate中好像有通过一个表,一条记录,N个字段,每个字段对应一个表,里面存储了这个表中 当前最大的字段,我觉得是否可以考虑用这个方法来实现。
专注or全面 2014-08-29
  • 打赏
  • 举报
回复
个人感觉效果是一样的,前者的做法也是以排它锁的方式防止并发,序列化可以达到同样的效果。
开博送货单管理软件是一套专为小型企业或个体户及个人用于送货单管理的软件,本软件依据我司在各种行业内积累的丰富的信息化经验而研发,结合各行各业的特点而量身订做的管理系统。开博送货单打印软件源自于我司大型ERP系统框架并依据小型企业的实际情况而研发,功能强大、操作简便、且具有超强的个性化能力,可满足不同客户的特殊要求。 开博送货开单管理软件介绍: 开博送货单管理软件不仅仅集成了送货单管理、产品管理、客户管理、数据分析、图表分析等常见的送货单打印管理功能,还具有仓存进出仓管理、应收账款管理、银行收支管理、文档资料管理等等功能,在管理好送货单的同时,您还可以管理好您的产品进销存情况以及客户欠款情况。 开博送货单管理软件特点: 1、开博送货单打印软件具有数据自动记忆功能:您开过的送货单不再需要重复录入; 2、您开过单的的客户信息自动保留到客户资料库中,您给任何一个客户的产品售价自动记录并在当次开单时自动提示……等等; 3、能够做到了您所想不到的细致功能。送货单号由系统自动生成(可按年 月 日 流水号等多种格式生成送货单号),真正的方便实用; 4、系统内置强大的权限管理功能,真真正正的让您从此告别手工抄写送货单和使用EXCEL做月结的烦恼; 5、打印出整齐漂亮的送货单,同时还能即时管理客户欠款。 6、开博送货单打印软件内置强大的打印功能,可以打印任何格式的送货单,可以根据用户要求修改打印格式。 7、充分利用强大的数据库功能给工作带来的便利,简单管理从现在开始。 开博送货开单管理软件 v5.63更新日志: 1、优化微信通知功能 2、优化搜索功能  开博送货单管理软件截图

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧