您正在使用IPV4(54.161.98.96)访问本站 您本次共访问本站 1 次
 用户名: 密 码: 验证码:     用QQ登录本站
首页 软件 编程 笑话 知识 公告 台风 日历 计算器 行情 简化版
文明驾车我带头,文明行路我带头,礼貌让座我带头      

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年74元      
[公益] 节省一分零钱 献出一份爱心 温暖世间真情      
2022年 情人节 18
2022年 元宵节 19
2023年 元 旦 339
2022年 春 节 5
 
  • 本类新增
    本类热门文章
    您现在的位置:首页 >> 数据库 >> 内容
    mysql+mybatis实现存储过程+事务 + 多并发流水号获取
    内容摘要: 数据库存储过程DROPPROCEDUREIFEXISTS`generate_serial_number_by_date`;CREATEPROCEDURE`generate_serial_number_by_date`(INparam_keyvarchar(100),INparam_org_idbigint,INparam_period_date_format......
    数据库存储过程

    DROPPROCEDUREIFEXISTS`generate_serial_number_by_date`;

    CREATEPROCEDURE`generate_serial_number_by_date`(

    INparam_keyvarchar(100),

    INparam_org_idbigint,

    INparam_period_date_formatvarchar(20),

    OUTresultbigint,

    OUTcurrent_datestrvarchar(20))

    begin

    declareold_datestrvarchar(20);

    STARTTRANSACTION;

    ifparam_period_date_format='infinite'then

    setcurrent_datestr='00000000';

    else

    setcurrent_datestr=DATE_FORMAT(NOW(),param_period_date_format);

    endif;

    select

    number,datestr

    fromsys_serial_number

    wheretable_key=param_key

    andorg_id=param_org_id

    andperiod_date_format=param_period_date_format

    intoresult,old_datestr

    forupdate;

    IFresultisnullthen

    setresult=1;

    insertintosys_serial_number(table_key,org_id,period_date_format,datestr,number,description)

    values(param_key,param_org_id,param_period_date_format,current_datestr,1,'addbyprocedure');

    elseifold_datestr!=current_datestrthen

    setresult=1;

    updatesys_serial_number

    setnumber=1,

    datestr=current_datestr

    wheretable_key=param_key

    andorg_id=param_org_id

    andperiod_date_format=param_period_date_format;

    endif;

    updatesys_serial_numbersetnumber=number+1

    wheretable_key=param_key

    andorg_id=param_org_id

    andperiod_date_format=param_period_date_format;

    commit;

    end

    流水号表

    DROPTABLEIFEXISTS`sys_serial_number`;

    CREATETABLE`sys_serial_number`(

    `table_key`varchar(100)NOTNULLCOMMENT'主键(建议用表名)',

    `org_id`bigint(20)NOTNULLDEFAULT'0'COMMENT'分公司ID',

    `number`bigint(20)NOTNULLDEFAULT'1'COMMENT'流水号(存储过程控制递增,获取完后+1)',

    `period_date_format`varchar(20)NOTNULLCOMMENT'流水号生成周期日期格式',

    `datestr`varchar(20)DEFAULTNULLCOMMENT'流水号日期值',

    `description`varchar(100)DEFAULTNULLCOMMENT'描述',

    PRIMARYKEY(`table_key`,`org_id`,`period_date_format`)

    )ENGINE=InnoDBDEFAULTCHARSET=utf8ROW_FORMAT=DYNAMICCOMMENT='流水号生成表';

    mybatis配置

    <selectid="generateSerialNumber"parameterType="java.util.HashMap"statementType="CALLABLE">

    <![CDATA[

    {

    callgenerate_serial_number(

    #{param_key,mode=IN,jdbcType=VARCHAR},

    #{param_org_id,mode=IN,jdbcType=BIGINT},

    #{result,mode=OUT,jdbcType=BIGINT}

    )

    }

    ]]>

    </select>

    测试代码

    @Override

    publicMap<String,Object>generateSerialNumber(Map<String,Object>param){

    sysSerialNumberMapper.generateSerialNumber(param);

    returnparam;

    }

    finalMap<String,Object>param=newHashMap<String,Object>();

    param.put("param_key","contract");

    param.put("param_orgId",84);

    newThread(newRunnable(){

    @Override

    publicvoidrun(){

    for(inti=0;i<100;i++){

    Map<String,Object>map=serialNumberProvider.generateSerialNumber(param);

    System.out.println("thread-1:"+map.get("result"));

    }

    }

    }).start();

    newThread(newRunnable(){

    @Override

    publicvoidrun(){

    for(inti=0;i<100;i++){

    Map<String,Object>map=serialNumberProvider.generateSerialNumber(param);

    System.out.println("thread-2:"+map.get("result"));

    }

    }

    }).start();

    newThread(newRunnable(){

    @Override

    publicvoidrun(){

    for(inti=0;i<100;i++){

    Map<String,Object>map=serialNumberProvider.generateSerialNumber(param);

    System.out.println("thread-3:"+map.get("result"));

    }

    }

    }).start();

    byte[]b=newbyte[0];

    synchronized(b){

    b.wait();

    }

    如果运行代码报以下错误

    ###SQL:

    {

    callgenerate_serial_number_by_date(

    ?,?,?,?,?

    )

    }

    ###Cause:java.sql.SQLException:Parameternumber4isnotanOUTparameter

    ;SQL[];Parameternumber4isnotanOUTparameter;nestedexceptionisjava.sql.SQLException:Parameternumber4isnotanOUTparameter

    排查方法:

    1、检查存储过程是否正确创建

    2、检查数据源连接用户是否有存储过程执行权限

    上一篇:SQL2005查看死锁存储过程sp_who_lock 下一篇:MySQL数据库终端—常用操作指令代码
    发布日期:2022/1/1
    手机扫二维码直达本页
    发布时间:14:28:28
    点击:289
    录入:齐天大圣
    相关文章
    Baidu
    YiJiaCMS 6.1.0.10988 Build 21.12.28(MSSQL) 闽ICP备05000814号-1
    本空间由腾讯云(轻量应用服务器)提供,百度云加速提供加速防护

    Copyright©2000-2022