流水号自增规则:时间(天) + ?自增流水(000)
例如:20150109001,20150109016,20150110001
?
思路一:
? ? 思路:java通过static 和?synchronized来实现
? ? 问题:如果是单纯的一个静态变量,那么如果服务器意外重启,这个变量会从0开始。
? ? 解决:如果是0的话去持久化介质中验证是否这天从0开始
? ? 总结:java 内存方式固然性能好,实现简单,但是毕竟不是从实际持久化取值,会有数据不同步的情况。
?
思路二:
? ? 思路:通过sql实现,把并发问题交给数据库处理
?
? ? mysql:
class="sql">INSERT INTO tmp_order (orderNum) ( SELECT CONCAT('20150202',liushui) FROM ( SELECT CASE WHEN orderNum IS NULL THEN '001' WHEN RIGHT(MAX(orderNum),3)+1 <10 THEN CONCAT('00',RIGHT(MAX(orderNum),3)+1) WHEN RIGHT(MAX(orderNum),3)+1 <100 THEN CONCAT('0',RIGHT(MAX(orderNum),3)+1) ELSE RIGHT(MAX(orderNum),3)+1 END liushui FROM tmp_order t WHERE t.orderNum LIKE '20150202%' ) t1 )
? ? 如果不加日期的纯流水可以考虑使用zerofill
? ? 如果担心数据库的并发处理会出问题,可以将这个字段设置成唯一,前台做良好的错误提示或自动提交。
?
? ? 以上只是个人浅见,欢迎大家指教讨论~