生成自增流水号

3 篇文章 0 订阅

流水号自增规则:时间(天) +  自增流水(000)

例如:20150109001,20150109016,20150110001

 

思路一:

    思路:java通过static 和 synchronized来实现

    问题:如果是单纯的一个静态变量,那么如果服务器意外重启,这个变量会从0开始。

    解决:如果是0的话去持久化介质中验证是否这天从0开始

    总结:java 内存方式固然性能好,实现简单,但是毕竟不是从实际持久化取值,会有数据不同步的情况。

 

思路二:

    思路:通过sql实现,把并发问题交给数据库处理

 

    mysql:

Sql代码 
  1. INSERT INTO tmp_order (orderNum) (  
  2. SELECT CONCAT('20150202',liushui)  FROM   
  3. (  
  4. SELECT   
  5. CASE  
  6.   WHEN orderNum IS NULL THEN '001'  
  7.   WHEN RIGHT(MAX(orderNum),3)+1 <10 THEN CONCAT('00',RIGHT(MAX(orderNum),3)+1)  
  8.   WHEN RIGHT(MAX(orderNum),3)+1 <100 THEN CONCAT('0',RIGHT(MAX(orderNum),3)+1)  
  9.   ELSE RIGHT(MAX(orderNum),3)+1 END liushui FROM  tmp_order t  
  10. WHERE t.orderNum LIKE '20150202%'  
  11. ) t1  
  12. )  

    如果不加日期的纯流水可以考虑使用zerofill

    如果担心数据库的并发处理会出问题,可以将这个字段设置成唯一,前台做良好的错误提示或自动提交。

 

    以上只是个人浅见,欢迎大家指教讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值