oracle订单号重复,流水号重复解决思路

流水号重复系统'保存'按钮事件里,通过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

意思就是对跳号取值的表 脏读(未提交成功数据+已经提交的数据)取出对应的数据

这样 取出的数据做跳号则不会重复的问题~~~~~~~~~~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值