• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL高并发生成唯一订单号的方法实现

    前言

    这篇博文发布后,有朋友问有没有SQL server版本的,现在有了==》传送门

    一、场景再现

    在一个erp进销存系统或0A等其他系统中,如果多人同时进行生成订单号的操作的话,容易出现多人获得同一个订单号的情况,对公司业务造成不可挽回的损失

    二、如何避免高并发情况订单号不唯一

    我们可以利用存储过程和数据表搭配,建立一张表和创建存储过程,存储过程负责生成订单号,表负责处理唯一性问题


    当存储过程生成一个订单编号,首先先把订单号写进表中,再把订单号结果显示出来,把生成的订单号写进表里会出现两种情况,为什么呢?因为我们的表设置了主键(主键唯一性)

    三、高并发情况下生成唯一订单号的过程

    下面将用代码和实际操作讲解下生成唯一订单号的过程

    第一步:建一张数据表,设置订单号字段为主键(唯一订单号的关键)

    第二步:创建生成订编号的存储过程

    生成订单编号格式为:自定义前缀+年月日+后缀(001、002、003)
    1.首先创建一个存储过程
    输入为BILL_TYPE(前缀),输出为BILL_NOP(订单编号)

    CREATE DEFINER = CURRENT_USER PROCEDURE `getbillno`(in BILL_TYPE VARCHAR(3), out BILL_NOP varchar(25))
    BEGIN 

    2.生成年月日和后缀
    年月日为当前系统时间,后缀初始值为0

    DECLARE currentDate varCHAR (15);
    DECLARE lastno INT DEFAULT 0;
    SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate;

    3.查询表格,获取表格的订单编号
    查询表格,获取前缀与自定义内容相关的最新一个订单编号

    SELECT IFNULL(BILL_NO, 'notnull') INTO BILL_NOP
     FROM temp_bill 
     WHERE SUBSTRING(BILL_NO,1,3) =BILL_TYPE and
     SUBSTRING(BILL_NO,4,8) =currentDate
     ORDER BY BILL_NO DESC LIMIT 1;

    4.生成订单编号

    如果上一步获取的订单编号不为空,新生成的订单号在原订单号上+1

    例:获取的订单号:UIE20200611015
    即生成的订单号为:UIE20200611016

    如果上一步获取的订单号为空,新生成的订单号后缀为001
    例:生成的订单号:UIE20200611001

    IF BILL_NOP !='' THEN
     SET lastno = CONVERT(SUBSTRING(BILL_NOP, -3), DECIMAL) ; 
     SELECT 
     CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;
    ELSE
     SELECT 
     CONCAT(BILL_TYPE,currentDate,LPAD((lastno + 1),3, '0')) INTO BILL_NOP ;
    END IF;

    5.将生成的订单号插入表中
    如果表中存在相同订单号则插入表失败
    如果表中不存在相同订单号则插入表成功

    INSERT INTO temp_bill (BILL_NO, BILL_TYPE) VALUES (BILL_NOP,BILL_TYPE) ;

    6.返回唯一订单编号
    当订单插入表成功,即可返回唯一的订单编号(如果上一步不成功,即不会运行这一步)

    SELECT BILL_NOP;

    四、运行结果

    1.首先我的表里没有数据,会生成前缀(我输入的:UIE)+年月日(
    20200611)+001(第一个数据,所以是001)
    即:UIE20200611001

    2当我第二次输入时,由于表里有数据了,会根据最新的订单编号后缀加1
    即:UIE20200611002

    五、不是小结的小结

    代码下载链接:mysql_getbillno.sql

    代码截图:

    到此这篇关于MySQL高并发生成唯一订单号的方法实现的文章就介绍到这了,更多相关MySQL高并发生成唯一订单号内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • MySQL系列之十 MySQL事务隔离实现并发控制
    • 详解MySQL多版本并发控制机制(MVCC)源码
    • mysql的MVCC多版本并发控制的实现
    • MySQL 加锁控制并发的方法
    • Mysql事务并发问题解决方案
    • MySQL 数据库如何解决高并发问题
    • mysql并发控制原理知识点
    • mysql多版本并发控制MVCC的实现
    • MySQL并发更新数据时的处理方法
    • Tomcat+Mysql高并发配置优化讲解
    • MySQL 到底是如何做到多版本并发的?
    上一篇:MySQL切分函数substring()的具体使用
    下一篇:MySQL中使用游标触发器的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL高并发生成唯一订单号的方法实现 MySQL,高并发,高,并发,生成,