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


相关推荐
草莓熊Lotso10 分钟前
Linux 进程信号深度解析(下):信号的保存、阻塞与捕捉
android·linux·运维·服务器·数据库·c++·性能优化
ALex_zry2 小时前
C++ ORM与数据库访问层设计:Repository模式实战
开发语言·数据库·c++
运维老曾2 小时前
Flink MySQL source 自定义开发步骤
大数据·mysql·flink
Arva .8 小时前
深分页与游标
数据库·oracle
idolao8 小时前
MySQL 5.7 安装教程:详细步骤+自定义安装+命令行客户端配置(Windows版)
数据库·windows·mysql
20年编程老鸟java+ai全栈9 小时前
mysql、pg、oracel数据库迁移避坑指南
数据库·mysql
Rsun0455110 小时前
Redis中实现访问量计数
数据库·redis·缓存
西柚00110 小时前
Ubuntu22.04.5 + Docker + MySQL 5.7
mysql·docker·容器
天空属于哈夫克310 小时前
自动化素材中枢:实现云端文件与外部群消息的异步同步方案
数据库·oracle
Navicat中国10 小时前
Navicat Premium Lite 正式登录鸿蒙应用市场
数据库·华为·harmonyos·navicat