数据库存储过程

DROP PROCEDURE IF EXISTS `generate_serial_number_by_date`;
CREATE PROCEDURE `generate_serial_number_by_date`(
IN param_key varchar(100),
IN param_org_id bigint,
IN param_period_date_format varchar(20),
OUT result bigint,
OUT current_datestr varchar(20))
begin declare old_datestr varchar(20); START TRANSACTION; if param_period_date_format='infinite' then
set current_datestr = '';
else
set current_datestr = DATE_FORMAT(NOW(), param_period_date_format);
end if; select
number, datestr
from sys_serial_number
where table_key = param_key
and org_id = param_org_id
and period_date_format = param_period_date_format
into result, old_datestr
for update; IF result is null then set result = 1; insert into sys_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, 'add by procedure'); elseif old_datestr != current_datestr then set result = 1; update sys_serial_number
set number = 1,
datestr = current_datestr
where table_key = param_key
and org_id = param_org_id
and period_date_format = param_period_date_format; end if; update sys_serial_number set number = number + 1
where table_key = param_key
and org_id = param_org_id
and period_date_format = param_period_date_format;
commit;
end

流水号表

DROP TABLE IF EXISTS `sys_serial_number`;
CREATE TABLE `sys_serial_number` (
`table_key` varchar(100) NOT NULL COMMENT '主键(建议用表名)',
`org_id` bigint(20) NOT NULL DEFAULT '' COMMENT '分公司ID',
`number` bigint(20) NOT NULL DEFAULT '' COMMENT '流水号(存储过程控制递增,获取完后+1)',
`period_date_format` varchar(20) NOT NULL COMMENT '流水号生成周期日期格式',
`datestr` varchar(20) DEFAULT NULL COMMENT '流水号日期值',
`description` varchar(100) DEFAULT NULL COMMENT '描述',
PRIMARY KEY (`table_key`,`org_id`,`period_date_format`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='流水号生成表';

mybatis配置

<select id="generateSerialNumber" parameterType="java.util.HashMap" statementType="CALLABLE">
<![CDATA[
{
call generate_serial_number (
#{param_key,mode=IN,jdbcType=VARCHAR},
#{param_org_id,mode=IN,jdbcType=BIGINT},
#{result,mode=OUT,jdbcType=BIGINT}
)
}
]]>
</select>

测试代码

@Override
public Map<String, Object> generateSerialNumber(Map<String, Object> param) {
sysSerialNumberMapper.generateSerialNumber(param);
return param;
}
final Map<String, Object> param = new HashMap<String, Object>();
param.put("param_key","contract");
param.put("param_orgId", 84);
new Thread(new Runnable() {
@Override
public void run() {
for(int i =0; i<100; i++) {
Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
System.out.println("thread-1:" + map.get("result"));
}
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
for(int i =0; i<100; i++) {
Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
System.out.println("thread-2:" + map.get("result"));
}
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
for(int i =0; i<100; i++) {
Map<String, Object> map = serialNumberProvider.generateSerialNumber(param);
System.out.println("thread-3:" + map.get("result"));
}
}
}).start(); byte[] b = new byte[0];
synchronized(b) {
b.wait();
}

如果运行代码报以下错误

### SQL: {            call generate_serial_number_by_date (             ?,             ?,             ?,             ?,             ?             )            }
### Cause: java.sql.SQLException: Parameter number 4 is not an OUT parameter
; SQL []; Parameter number 4 is not an OUT parameter; nested exception is java.sql.SQLException: Parameter number 4 is not an OUT parameter

排查方法:

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

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

mysql+mybatis+存储过程+事务 + 多并发流水号获取的更多相关文章

  1. Mysql事务,并发问题,锁机制

    .什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束 ...

  2. mysql 存储过程 事务; mysql的事务中包含一个存储过程

    在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions  来进行处理 TransactionOptions transactionOption = ...

  3. mysql之——存储过程 + 游标 + 事务

    下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: ...

  4. Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  5. 【转】Mysql事务,并发问题,锁机制

    转自:http://www.cnblogs.com/fidelQuan/p/4549068.html 1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成 ...

  6. mysql 视图,事务,存储过程,触发器

    一 视图 视图是一个虚拟表(非真实存在),是跑到内存中的表,真实表是硬盘上的表.使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sq ...

  7. MySQL事务、并发问题、锁机制

    MySQL事务,并发问题,锁机制 1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库 ...

  8. Mysql事务,并发问题,锁机制-- 幻读、不可重复读--专题

    1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约 ...

  9. mybatis调用mysql的存储过程(procedure),实现查询操作(student表中的某个年级中的总人数 select (1) 或者 select (*))

    step1:在mysql cmd中新建存储过程: drop procedure if exists queryCountByGrade ; delimiter // -- 定义存储过程结束符号为// ...

随机推荐

  1. CPU host-passthrough技术与应用

    为了保证虚拟机在不同宿主机之间迁移的时候的兼容性,Libvirt对CPU提炼出标准的几种类型,在/usr/share/libvirt/cpu_map.xml中可以查到.cpu_map.xml不仅是CP ...

  2. Unity3D Sprite Draw Call合批规则

    只要材质相同,并Sprite在同一Atlas里,就可以合批. 不论Sorting Layer不同,还是Sorting Order不同. 材质相同的两个不同Sorting Order之间插入一个不同材质 ...

  3. ecshop目录结构

    ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ affiliate.php 生成商品列表┣ ...

  4. 使用commons-fileupload包进行大文件上传注意事项

    项目中使用 commons-fileupload-1.2.1.jar 进行大文件上传. 测试了一把,效果很不错. 总结如下: 必须设置好上传文件的最大阀值 final long MAX_SIZE = ...

  5. Spring的Bean之Bean的基本概念

    从前面我们知道spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品.对于Spring容器能够生产那些产品,则取决于配置文件中配置. 对于我们而言,我们使用Spring框架 ...

  6. NGINX将PHP带参数的URL地址重定向二级或多级域名访问

    今天项目中有一个手机站点需要用*.m.domain.com的三级域名访问. 如手机站点的访问网址为m.domain.com,手机下面的会员实际访问地址为index.php?username=$user ...

  7. 【8-16】Android学习笔记01

    Android目录树 Activity 生命周期 创建一个 Activity 在 android 中创建一个 Activity 要编写一个继承自 android.app.Activity的 Java ...

  8. jquery判断checkbox是否选中及改变checkbox状态

    转自:http://blog.csdn.net/limingchuan123456789/article/details/11499665 jquery判断checked的三种方法:.attr('ch ...

  9. Excel 使用CHIINV函数和GAMMA.DIST函数绘制卡方分布

    1.使用CHIINV(概率,自由度),在Excel中绘制卡方分布. 若n个独立的随机变量均服从标准正态分布,则这n个随机变量的平方和构成一新的随机变量,其分布规律称为服从自由度为ν 的χ2分布. 2. ...

  10. java依赖注入

    接口的作用 1.在spide中创建一个私有接口 private Downloadable downlaodable 覆盖set get 方法 创建一个方法  Public Page down load ...