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


相关推荐
Hello.Reader2 分钟前
Spark RDD 编程从驱动程序到共享变量、Shuffle 与持久化
大数据·分布式·spark
睡前要喝豆奶粉5 分钟前
.NET Core Web API中数据库相关配置
数据库·c#·.netcore
大G的笔记本18 分钟前
高频 Redis 面试题答案解析
数据库·redis·缓存
万事大吉CC1 小时前
SQL语法基础教程
数据库·oracle
betazhou1 小时前
Oracle dgbroker常规命令管理简介
数据库·oracle·adg·dbbroker
海边夕阳20062 小时前
PostgreSQL性能调优:解决表膨胀、索引碎片和无效索引问题
数据库·经验分享·postgresql·性能优化
IT教程资源C2 小时前
(N_083)基于springboot毕业设计管理系统
mysql·springboot毕业管理
一 乐2 小时前
个人理财系统|基于java+小程序+APP的个人理财系统设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·后端·小程序
m0_748248022 小时前
Redis的数据淘汰策略解读
数据库·redis·缓存
哥哥还在IT中3 小时前
让数据库更智能-大模型如何优化我们的SQL查询
数据库·sql