流水号重复,该怎么解决

流水号重复
系统'保存'按钮事件里,通过sql语句获取max(预送单号),在其基础上加1,得到新的预送单号,现在系统有10几个人用,有时候同时‘保存’时会出现预送单号重复问题。有什么好的方法解决?

------解决方案--------------------
这种最好用自增列来控制,或者用专门的表来存储当前max单号值,然后通过锁表的方式取号
------解决方案--------------------
新号是在update的时候才生成的么?如果是的话,在这么短的传输时间内都能“同时”提交的话确实只能交给数据库处理了。用触发器或者带直接传带计算的sql给数据库。
------解决方案--------------------
新增单号表,每个提交用户都在表栏位的值上加1就ok了
------解决方案--------------------
有几百人同时使用的系统,使用这种办法,好像也没有遇到取号重复的问题啊!
------解决方案--------------------
探讨
表已经有了自增列,想写个存储过程来控制。

------解决方案--------------------
~~流水号重复主要原因是:

多用户提交或同时提交,因时间差的问题,存在还未提交成功的数据,

解决此问题:

 关键是 取 多事务未提交成功数据+已经提交的数据(则是脏读)


如 :

sybase :
select max(sendno) from t_sendtable where 1=1 at isolation read uncommitted

MS SQL Server :
select max(sendno) from t_sendtable with(nolock) where 1=1
.

.

.

意思就是对流水号取值的表 脏读(未提交成功数据+已经提交的数据)取出对应的数据
这样 取出的数据做流水号跳号则不会重复的问题~~~~~~~~~~~

////////////////

------解决方案--------------------
最简单的处理:每个用户端加个台号,自己生成自己的,呵呵。
------解决方案--------------------
探讨
引用:
表已经有了自增列,想写个存储过程来控制。


这个解决方案要看你用的是什么数据库系统。
oracle:
定义一个预送单号的序列,使用该序列生成预送单号,可以保证并发时不会取重。

sql server:
将预送单号列设为自增列,由数据库自动维护该列的值。


------解决方案--------------------
提前取号不就是了,取号不用作废