获取不重复流水号(java)

一:概述

很多业务场景都需要获取不重复的业务流水号,当微服务项目或服务多节点部署时,获取流水号场景使用分布式锁性能低下,可以基于数据库行锁实现获取不重复流水号。

二:创建流水号数据库

sql 复制代码
CREATE TABLE `serial` (
  `id` varchar(32) NOT NULL COMMENT '唯一标识',
  `prefix` varchar(32) DEFAULT NULL COMMENT '流水前缀',
  `num` int(11) DEFAULT NULL COMMENT '流水序号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `serial_prefix_IDX` (`prefix`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流水号';

三:获取流水工具

3.1:创建mapper方法及对应xml文件

xml 复制代码
## mapper文件创建两个方法
/**
     * 根据前缀获取流水号
     * @param prefix
     * @return
     */
    Serial getByPrefix(@Param("prefix")String prefix);

    /**
     * 更新流水号
     * @return
     */
    Integer updSerial(@Param("id")String id,@Param("num")Integer num);
    ## 对应 xml文件方法
    <select id="getByPrefix" resultType="。。。Serial">
        select * from serial sde where prefix = #{prefix}
    </select>

    <update id="updSerial">
        update serial set num=#{num}+1 where id=#{id} and num =#{num}
    </update>

3.2:获取流水号方法

java 复制代码
@Resource
	private SerialMapper mapper;


	@Override
	public String getNum(String prefix) {
		while (true){
			Serial num = mapper.getByPrefix(prefix);
			if(num==null){
				this.insert(new Serial(prefix,1));
				return String.format("%05d",1);
			}else {
				if(mapper.updSerial(num.getId(),num.getNum())>0){
					return String.format("%05d",num.getNum()+1);
				}
			}
		}
	}
相关推荐
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge4 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet