当前位置: 代码迷 >> PB >> 流水号反复
  详细解决方案

流水号反复

热度:15   发布时间:2016-04-29 07:34:37.0
流水号重复
系统'保存'按钮事件里,通过sql语句获取max(预送单号),在其基础上加1,得到新的预送单号,现在系统有10几个人用,有时候同时‘保存’时会出现预送单号重复问题。有什么好的方法解决?
------解决方案--------------------
事务控制,自增列。。。
------解决方案--------------------
嘿嘿,大姨妈走了
------解决方案--------------------
我用的是oracle,自定义一个过程,其过程自动提交,返回ID+1,具体数据存在一张表里。
------解决方案--------------------
如果是oracle那很简单,建一个序列,并用这个序列建个触发器,例如:
declare 
next_seq_no number;

begin
  select qhse_record_seq.nextval into next_seq_no from dual;
  :new.row_no := next_seq_no;
end;
其中qhse_record_seq即为序列
new.row_no是表中的KEY列名
这样每当在表棕增加一条记录时,就可以增加一个seq_no号,它是唯一的。但是要记住,这个唯一值如果没有采用,就会甩掉。可能是不连续的。这和sql server中的id一样。
------解决方案--------------------
这个解决方案要看你用的是什么数据库系统。
oracle:
定义一个预送单号的序列,使用该序列生成预送单号,可以保证并发时不会取重。

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

其它数据库就不知道了,如果数据库不支持类似的功能可以采用以下方案自定义自增列:
1. 生成1个自增序列的表serial_table,表的结构为serial_name与serial_no
2. 插入记录,serial_name = 'ysdh',serial_no = 1 (如果不是从1开始就使用初始值)
3. 在需要生成预送单号的位置使用以下代码来获取序列号:
// 生成新的序列号并锁定
update serial_table set serial_no = serial_no + 1;
select serial_no into :ll_serialno from serial_table where serial_name = 'ysdh';

如果要使用存储过程取序列号得看你用的什么数据库,去相关板块学下怎么写存储过程就可以了,这个逻辑很简单的。 
 

------解决方案--------------------
我用sql,建一个表存储最后的ID号,每读一次自动加1。
------解决方案--------------------
偶觉得有二个方案
一、系统自增长列,也就是5楼xiaobn_cn兄弟说的
二、自己维护一个参数表,保存最大ID,也就是6楼wlj768兄弟说的,每次操作时,先SELECT当前值,SELECT时行锁定,然后该值+1,再UPDATE到参数表
------解决方案--------------------
引用:
偶觉得有二个方案
一、系统自增长列,也就是5楼xiaobn_cn兄弟说的
二、自己维护一个参数表,保存最大ID,也就是6楼wlj768兄弟说的,每次操作时,先SELECT当前值,SELECT时行锁定,然后该值+1,再UPDATE到参数表


顶七楼~
------解决方案--------------------
~~重复主要原因是:多用户提交或同时提交,因时间差的问题,存在还未提交成功的数据,解决此问题 关键是 取 多事务未提交成功数据+已经提交的数据(则是脏读)

如 : 

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存储过程,http://www.daimami.com/oracle-develop/177537.html
  相关解决方案