日期:2014-05-18  浏览次数:21728 次

如何生成连续不重复的序列号
B/S模式下,多客户端访问,生成连续不重复的序列号。请高手指点如何实现。
我想在客户生成一串由数字组成的字符串放到数据库中一列当做单据的序列号,每次生成的序列号存到数据库后都是连续不重复的。当然保存到数据库后删除数据造成的号码断号不用考虑。
请教大侠们是如何实现的?

------解决方案--------------------
考虑以时间,时分秒来区分,不过也会出现同秒的重复,还可以使用GUID
------解决方案--------------------
年月日时分秒+10位随机数,再进行MD5加密

------解决方案--------------------
建一个表,用一个字段储存最后一次生成的序号,如果需要按日期重新开始,那就再存个日期

每次获取新序列号时开始一个新事务,更新序列号+1,然后select出来作为新序号用。

因为每次都有事务,并且是先更新再查询,可以保证不会有重复数字生成。
代码就不贴了,也就几行而已。


------解决方案--------------------
如果同一时间的话,请等待,等待一个生成后在去生成另一个啊
------解决方案--------------------
很多种方法。

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

许多其它的数据库(比如Oracle)默认都不是这么严格的级别。所以这个方法并不能用在Oracle、Mysql等上面。当然NoSQL更不能。

实际上流水号并不是必须在保存业务数据时必须立刻赋值的系统编号(就像上面说的GUID编号可以作为与业务无关的系统编号)。你把一个业务数据保存了,及时没有流水号,那么也可以通过真正的记录唯一号来存取记录。许多业务实际上甚至会事后还修改流水号。再比如,有人想当然地把发票号当作数据库记录的唯一编号。他没有想到用户可能会发现录入错了发票号,而需要修改。所以把业务意义上的编号当作与业务无关的记录编号是错误的。

了解这个道理,那么其实有很多其它的解决办法就非常顺理成章了。比如你可以让一个程序去自动搜索还没有编流水号的记录,然后给记录编写流水号。整个系统中只要保证只有一个程序去编流水号,而不是并发的,就没有问题。而你保存业务记录时,并不需要立刻返回带有流水号的记录。当你去查询、刷新业务记录时,可能后台的那个程序刚好编完了这个流水号,于是就显示出来了。就算它运行很慢,你在查询页面上也可以刷新一下,直到看到编写好的流水号。
------解决方案--------------------
我建议楼主用年月日时分秒+5位随机数去生成
同时在数据库检测一下
如果存在,则+1,不存在则加入

不会有问题!
------解决方案--------------------
用户ID + 客户端IP + 年月日时分秒 + 检测
------解决方案--------------------
两种方法:
1.建一个序号字段,每次读取时+1再放回去,当然要用事务处理的。测试过没问题。生成的号码可读性强。
2.web的可以用SESSIONSID+年月日时分秒和毫秒。这样直接可以用,但是得到的号码太长了。
------解决方案--------------------
不能加随机数,否则无法连续。
这其实最好实现了,因为数据库自己有同步锁,防止多人操作修改同一个数据,那么只要将连续序号记录在数据库中即可,每次使用序号+1,一条UPDATE语句即可实现:
SQL code
UPDATE TABLE1 SET @SNO = SNO = SNO+1 WHERE CODE = '序号'

------解决方案--------------------
探讨
我刚才想了一下,不用建表,在插入数据的时候,查找当前最大的序列号,然后+1,把这个作为插入参数。这样就可以了吧?

------解决方案--------------------

前缀字符可以去掉

给你个网址,自己看吧
http://www.52rs.net/ArticleView.aspx?gID=71bd9b1d-ad30-4f6e-896d-fed7dfbc1b3d
------解决方案--------------------
探讨

很多种方法。

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

许多其它的数据库(比如O……

------解决方案--------------------
我们一般用:年月日时分秒毫秒+3位随机数(总共20位),注意毫秒不够3位前面补零。个人觉得这种序列号的可读性比较好,尤其作为主键来说,记录的也是比较有序的。
------解决方案--------------------
如果只是用数字的话,时分秒+MAC地址转成数字,无论多少个客户同时点击,生成的序列号都不相同。
------解决方案--------------------
标识符有格式限制吗?
------解决方案--------------------
用户名+年月日时分秒
------解决方案--------------------
可以在数据库层创建序列号 create sequence ...
或SQL server 设置种子列
------解决方案--------------------