如何生成连续的流水号
工作中常常遇到流水号生成的问题,有的客户要求流水号必须连续,这个我们的开发工作提出了一个小难题。
解决方法如下:
方法一:采用最大号表的形式
在数据库中创建一个表专门存放其他数据库的最大流水号,table_maxOrderID {table1_max,table2_max};
在向数据库中插入数据的时候,首先想table_maxOrderId表查询到当前表的最大号加1,先更新最大号表,然后保存到业务数据。
优点:效率高
缺点:号码浪费大一些(例如保存的时候失败了,那么这个号码就浪费了。)
方法二:采用抢号的形式
这个不需要创建最大号表,在向数据库中保存数据的时候,获取当前表的最大流水号。例如:
select max(ID) from tableName ; 让后将结果加一。
优点:速度快,不浪费号码;
缺点:并发的时候,号码重复造成数据无法保存。
解决办法:抢号。如果保存失败,那么重复抢号例如:
public synchronized String getOrderId(String shengid) {
if (shengid == null || "".equals(shengid.trim())) {
throw new NullPointerException("在获取流水号的时候,省id为空!获取流水号失败!");
}
// 首先查找所在地区查找企业表中有没有数据
int num = xjqyDao.getCountBySql(" and qy_sheng='" + shengid + "'");
String orderId = null;
if (num == 0) {
orderId = "0001";
} else {
//必须找到本省最大的档案的id
String maxDabh = xjqyDao.getMaxDabhBySheng(shengid);
num = Integer.parseInt(maxDabh.substring(6));
String temp = (num + 1) + "";
int LEN = temp.length();
if (LEN > 4) {
log.error("出错了!一个省的蚕茧收购加工企业的个数不能超过1万!");
return null;
}
for (int i = 0; i < 4 - LEN; i++) {
temp = "0" + temp;
}
orderId = temp;
}
return orderId;
}
for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试!
try {
String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号
log.debug("获取到的连续的流水号为:" + orderId);
String dabh = ""; // 档案编号
String code = ""; // 企业编号
dabh = xjqy.getSheng() + xjqy.getJdrq().substring(0, 4)
+ orderId;
log.debug("档案编号为:" + dabh);
xjqy.setDabh(dabh);
// 所在省做了js校验
if (xjqy.getShi() == null || xjqy.getShi().equals("")) {
// 如果市为空
code = xjqy.getSheng() + "0000" + xjqy.getLb()
+ orderId;
} else if (xjqy.getXian() == null
|| xjqy.getXian().equals("")) {
// 如果县为空
code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;
} else {
code = xjqy.getXian() + xjqy.getLb() + orderId;
}
log.debug("企业编号为:" + code);
xjqy.setCode(code);
xjqyDao.create(xjqy);
log.debug("create object");
flag = true;// 保存成功!
break; // 退出循环
} catch (Exception e) {
log.debug("保存企业信息出错:", e);
}
}
if (!flag) {
throw new OurException("保存失败!请稍后重试!");
}
view plaincopy to clipboardprint?for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试! try {String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号log.debug("获取到的连续的流水号为:" + orderId);String dabh = ""; // 档案编号String code = ""; // 企业编号dabh = xjqy.getSheng() + xjqy.getJdrq().substring(0, 4)+ orderId;log.debug("档案编号为:" + dabh);xjqy.setDabh(dabh);// 所在省做了js校验if (xjqy.getShi() == null || xjqy.getShi().equals("")) {// 如果市为空code = xjqy.getSheng() + "0000" + xjqy.getLb()+ orderId;} else if (xjqy.getXian() == null|| xjqy.getXian().equals("")) {// 如果县为空code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;} else {code = xjqy.getXian() + xjqy.getLb() + orderId;}
log.debug("企业编号为:" + code);xjqy.setCode(code);xjqyDao.create(xjqy);log.debug("create object");flag = true;// 保存成功!break; // 退出循环} catch (Exception e) {log.debug("保存企业信息出错:", e);}}if (!flag) {throw new OurException("保存失败!请稍后重试!");}for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试!
try {
String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号
log.debug("获取到的连续的流水号为:" + orderId);
String dabh = ""; // 档案编号
String code = ""; // 企业编号
dabh = xjqy.getSheng() + xjqy.getJdrq().substring(0, 4)
+ orderId;
log.debug("档案编号为:" + dabh);
xjqy.setDabh(dabh);
// 所在省做了js校验
if (xjqy.getShi() == null || xjqy.getShi().equals("")) {
// 如果市为空
code = xjqy.getSheng() + "0000" + xjqy.getLb()
+ orderId;
} else if (xjqy.getXian() == null
|| xjqy.getXian().equals("")) {
// 如果县为空
code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;
} else {
code = xjqy.getXian() + xjqy.getLb() + orderId;
}
log.debug("企业编号为:" + code);
xjqy.setCode(code);
xjqyDao.create(xjqy);
log.debug("create object");
flag = true;// 保存成功!
break; // 退出循环
} catch (Exception e) {
log.debug("保存企业信息出错:", e);
}
}
if (!flag) {
throw new OurException("保存失败!请稍后重试!");
}小结:
如果要从严格意义上生成连续的流水号,那么应该采用抢号的方法,同时限制用户不准删除记录,这样才能保证流水号的严格 连续,否则录入5条,删掉其中的2条,那么用户看到的记录的号码将无法连续了。
如何生成连续的流水号相关推荐
- 自动生成业务单据流水号方案
我们在开发管理软件的时候,常常遇到流水号(单据号.登记号)自动生成.控制和管理的问题.由于流水号 具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题.特别是多个并发用 ...
- python随机生成列表_python 实现快速生成连续、随机字母列表
0.摘要 本文介绍了生成连续和随机字母表的方法,用于快速生成大量字母数据. 主要使用chr()函数,将数字通过ASCII表转换为相应字母. 1.chr() 函数 chr() 用一个范围在 range( ...
- 如何生成16位流水号
如何生成16位流水号 原文:如何生成16位流水号 /*** @Description: 获取long类型16流水号* @return serialNo long类型16流水号* @date 2017年 ...
- html 自动日期,excel自动生成连续日期
如何自动生成有规律连续的时间段,效果如下图 公式: =TEXT((19+(ROW()-1)/12)/24,"hh:mm") &"-" & TEX ...
- python读取rtsp流_python cv2读取rtsp实时码流按时生成连续视频文件方式
我就废话不多说了,直接上代码吧! # coding: utf-8 import datetime import cv2 import os ip = '192.168.3.160'.replace(& ...
- php生成连续递增的excel列索引
PHPExcel_IOFactory导出excel之列索引 生成连续递增的excel列索引 生成连续递增的excel列索引 俺其实是学java的,最近工作需要用到了php,有个导出excel的功能,改 ...
- UE4用Spline Component蓝图生成连续SplineMesh路径模型
Spline Component(不是SplineMesh)是UE4常用的样条曲线组件,是生成各种可视化路径.控制物体运行轨迹.生成排列组合模型等的基础. Spline可以不断增加控制点,以生成复杂的 ...
- mysql存入订单号不重复_MSSQL高并发下生成连续不重复的订单号
一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...
- 低代码学习教程:生成固定格式流水号
方法1:RECNO() 方法2:MAPX() 表单设计中经常涉及流水号的制作问题,下面就分别介绍下两种编号的实现方法,大家可以根据需要自行选择. 注意: 百数已支持[流水号]控件,如有特殊要求可参考文 ...
最新文章
- 35国,14年,世界最大科学项目,「人造太阳」即将诞生!
- C语言flood fill 泛洪算法(附完整源码)
- 四川中级职称计算机考试考b级,四川省职称计算机B级考试1卷
- 【今日CS 视觉论文速览】Wed, 16 Jan 2019
- POS Tagging 标签类型查询表(Penn Treebank Project)
- 银河水滴张曼:远距离步态识别系统与应用 |量子位沙龙回顾
- .net登录界面_JAVA实现简单的用户登录客户端
- HTTP中的POST、GET区别
- ExtJS 教程目录
- 透明网桥算法c++实现
- 《中华颂》朗诵比赛准备
- oracle中的userenv,Oracle 中的userenv()
- LL(1)预测分析程序
- 制造企业使用APS计划排产需要的条件
- 如何使用FFmpeg的解码器
- 一、ping与arping介绍
- 监控系统为什么要加流媒体服务器,视频监控系统为什么要使用流媒体服务器做视频分发?...
- 2.4.XXX 内核配置 介绍
- mysql当前读与快照读
- WordNet发展概况