生成自增流水号
程序员文章站
2022-04-04 21:55:20
...
流水号自增规则:时间(天) + 自增流水(000)
例如:20150109001,20150109016,20150110001
思路一:
思路:java通过static 和 synchronized来实现
问题:如果是单纯的一个静态变量,那么如果服务器意外重启,这个变量会从0开始。
解决:如果是0的话去持久化介质中验证是否这天从0开始
总结:java 内存方式固然性能好,实现简单,但是毕竟不是从实际持久化取值,会有数据不同步的情况。
思路二:
思路:通过sql实现,把并发问题交给数据库处理
mysql:
- 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
如果担心数据库的并发处理会出问题,可以将这个字段设置成唯一,前台做良好的错误提示或自动提交。
以上只是个人浅见,欢迎大家指教讨论~
上一篇: Java入门 之 线程
下一篇: Java入门 之 static