工作中常常遇到流水号生成的问题,有的客户要求流水号必须连续,这个我们的开发工作提出了一个小难题。
解决方法如下:
方法一:采用最大号表的形式
在数据库中创建一个表专门存放其他数据库的最大流水号,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("保存失败!请稍后重试!");
}
小结:
如果要从严格意义上生成连续的流水号,那么应该采用抢号的方法,同时限制用户不准删除记录,这样才能保证流水号的严格连续,否则录入5条,删掉其中的2条,那么用户看到的记录的号码将无法连续了。
分享到:
相关推荐
流水号生成软件是一种用于自动化创建连续、唯一标识序列号或编号的工具,广泛应用于各种数据库管理、订单处理、产品标识等场景。这类软件的核心功能是确保每个生成的流水号都是独一无二的,避免重复,以便有效地追踪...
流水号则是基于日期内的连续序列,确保在同一日期内每个订单号的唯一性。 1. **日期部分**:在Java中,我们可以使用`java.time`包下的类来获取当前日期。例如,`LocalDateTime.now()`可以获取当前的日期和时间,`...
在这个场景中,“java生成流水-格式202001270001”指的是一个Java程序,用于生成具有特定格式的流水号,如示例所示的“202001270001”,该格式包含了日期和连续的序列号。以下将详细解释这个过程涉及的关键技术点。 ...
在IT行业中,生成相同长度的流水号是一项常见的需求,特别是在数据库操作、订单处理或系统标识等领域。在C#编程语言中,我们可以利用多种方法来实现这一功能。下面将详细介绍如何在C#中生成相同长度的流水号,并提供...
这种方法适用于需要连续流水号但不显示在界面的情况。 总的来说,Oracle中生成流水号的方法主要依赖于数据库的事务管理和数据更新操作,可以通过函数或存储过程封装逻辑,以确保生成的流水号具有唯一性和可追踪性。...
在给定的“Produced-four-serial-for-java.rar”压缩包中,包含了一个用于生成四位流水号的Java代码示例,其主要目标是生成从0001到XXXX的连续四位数字流水号。 生成流水号的方法有很多种,这里我们重点关注描述中...
本文将详细介绍如何在`GridView`中实现流水号的添加,并确保即使在开启分页的情况下,流水号仍然能够连续递增。 #### 二、实现原理 为了实现流水号的添加,我们需要利用`GridView`的一个特性——`TemplateField`。...
这种方法能够生成连续的流水号编码,但可能会在多用户同时操作时产生冲突。为了避免这种冲突,可以在保存之前进行检查或使用其他机制确保唯一性。 ### SQL存储过程应用 存储过程`PWMS_GetMaxNo`的具体实现未在代码...
"小程序"标签可能意味着这个流水号生成器还可以作为一个轻量级的应用,用户可以通过简单的交互界面在手机或电脑上生成流水号,无需复杂的安装过程。 "心梓知识"可能是发布者或者开发者的名字,也可能是他们分享知识...
在生成连续流水号的场景下,如果不使用锁,可能会在高并发环境中出现数据不一致。示例代码展示了在没有锁定的情况下,可能存在的并发问题,以及如何通过`FOR UPDATE`子句获取行锁,确保在锁定状态下进行流水号的生成...
根据给定的信息,本文将详细解释如何通过 SQL 存储过程自动生成流水号,并提供一个实际的示例来展示这一过程。...此外,通过对存储过程和函数的合理设计,可以确保流水号的唯一性和连续性,从而满足业务需求。
一个典型的应用例子是在生成连续流水号时,使用FOR UPDATE子句可以确保在并发操作中正确生成唯一编号。 5. **性能优化**: - 了解如何通过索引、物化视图、分区和并行查询等技术来提升查询性能,同时避免全表扫描...
"magento插件-将订单号改为日期流水号"这个插件就是为了满足这一需求而设计的。 首先,我们来了解一下Magento的默认订单号系统。在Magento中,每个订单都会被赋予一个唯一的ID,这个ID通常是自增的整数。这样的设置...
一个典型的标识字符串可能包含字母、日期以及连续的流水号,这样的组合确保了每个生成的字符串的独特性。根据题目描述,我们需要生成的标识字符串在日期变化时会重置流水号,保持每天的流水号从1开始。 以下是一种...
本文将详细介绍如何在Microsoft Access中实现一个自动编号功能,该功能能够根据指定的前缀、当前日期以及连续递增的流水号生成唯一的编号。 #### 二、核心知识点解析 ##### 2.1 类结构与功能概述 本文提供的代码...
流水号是一种连续递增的数字,用于唯一标识系统中的每一条记录。它可以被应用于多种场景,如订单号、发票编号等。在本例中,我们构建了一个自动跳号的存储过程,能够按照指定规则生成包含日期和计数器在内的流水号。...
例如,日期时间序号可以反映出创建的时间,递增数字则适用于流水号,而随机数和UUID在保证唯一性的同时增加了不确定性。 2. **自定义前缀与后缀**:用户可能希望在序号中加入特定标识,如产品类型、部门代号等。...
1. **流水号生成**:流水号是连续的整数序列,用于确保每个新生成的号码都是独一无二的。在C#中,可以使用`System.Threading.Interlocked.Increment()`方法来原子性地增加一个计数器,确保在多线程环境下也能正确...
- **流水号自动生成**:在编码规则中启用流水号,系统将自动为每个新编码分配唯一的连续数字,无需手动输入。 3. **编码查询** - 编码查询功能允许用户通过关键词、日期范围等条件快速查找特定的物料编码,便于...