MySQL 按日期流水号 条码 分布式流水号

有这样一个场景,有多台终端,要获取唯一的流水号,流水号格式是 日期+0001形式,使用MySQL的存储过程+全局锁实现这个需求。

以下是代码示例。

注:所有的终端连接到MySQL服务器获取流水号,如果获取到的是 "-1",需要重新获取。

sql 复制代码
CREATE DEFINER = 'root'@'%'
PROCEDURE GetCurrentDateNumber()
BEGIN
    set @lock_string='order_num_lock';
    #5代表获取锁时等待5秒
    SELECT GET_LOCK(@lock_string,5) INTO  @order_num_lock;
    set @TodayString=DATE_FORMAT(CURDATE(),'%Y%m%d');
    IF @order_num_lock=1 THEN
       SELECT COUNT(*) INTO @TodayCount
       FROM OrderInfo WHERE LEFT(OrderNum,8)=@TodayString;
       IF @TodayCount=0 THEN
          set @SerialNum=CONCAT(@TodayString,'0001');
          INSERT INTO OrderInfo (OrderNum) VALUE (@SerialNum);
          select @SerialNum SerialNum;
       ELSE
          SELECT MAX(OrderNum) INTO @MaxOrderNum
          FROM OrderInfo WHERE LEFT(OrderNum,8)=@TodayString;

          set @SerialNumInt=cast(RIGHT(@MaxOrderNum,4) AS SIGNED)+1;
          SET @SerialNum=CONCAT(@TodayString,RIGHT(CONCAT('0000',CAST(@SerialNumInt AS char)),4));
          INSERT INTO OrderInfo (OrderNum) VALUE (@SerialNum);
          select @SerialNum SerialNum;
       END IF;
       select RELEASE_LOCK(@lock_string) INTO @RELEASE_LOCK;
    ELSE
       SELECT '-1' SerialNum; #拿不到锁时,返回-1
    END IF;
    
END


相关推荐
陌上丨8 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
AI_56788 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw8 小时前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH30738 小时前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道8 小时前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据10 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务10 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯11 小时前
mysql常用语句
数据库·mysql·oracle
qq_124987075311 小时前
基于Hadoop的信贷风险评估的数据可视化分析与预测系统的设计与实现(源码+论文+部署+安装)
大数据·人工智能·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
大模型玩家七七12 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习