生成自增流水号

流水号自增规则:时间(天) +  自增流水(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

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

 

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

你可能感兴趣的:(java,sql)