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


相关推荐
素材积累4 小时前
博士后出站来深可申请的项目补贴等
数据库
_1_76 小时前
SQL Server 磁盘满了 收缩日志
数据库·sqlserver
basketball6166 小时前
Redis基础:1. Redis介绍
数据库·redis·缓存
周末也要写八哥6 小时前
分布式技术之单机锁
分布式
李可以量化6 小时前
成交量的终极量化策略:价量共振指标完整实现(下篇)
前端·数据库·人工智能
汽车仪器仪表相关领域7 小时前
南华 NHAT-610 柴油车排放测试仪 产品详解
数据库·功能测试·汽车·压力测试·可用性测试
Shan12058 小时前
浅谈:分布式锁的系统分类
分布式
阿文的代码库8 小时前
干货分享——分布式锁的典型案例
分布式
我滴老baby9 小时前
工业时序数据实战:基于 DolphinDB 流计算引擎的实现与调优
数据库
睡不醒男孩0308239 小时前
TiDB数据库调研
数据库·tidb