mysql+mybatis實現(xiàn)存儲過程+事務(wù)?+?多并發(fā)流水號獲取
數(shù)據(jù)庫存儲過程
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 = '00000000';
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 '0' COMMENT '分公司ID', `number` bigint(20) NOT NULL DEFAULT '1' 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、檢查存儲過程是否正確創(chuàng)建
2、檢查數(shù)據(jù)源連接用戶是否有存儲過程執(zhí)行權(quán)限
到此這篇關(guān)于mysql+mybatis實現(xiàn)存儲過程+事務(wù) + 多并發(fā)流水號獲取的文章就介紹到這了,更多相關(guān)mysql mybatis存儲過程流水號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫和oracle數(shù)據(jù)庫之間互相導(dǎo)入備份
今天小編就為大家分享一篇關(guān)于mysql數(shù)據(jù)庫和oracle數(shù)據(jù)庫之間互相導(dǎo)入備份,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
ERROR CODE: 1175 YOU ARE USING SAFE UPDATE MODE AN
這篇文章主要介紹了ERROR CODE: 1175 YOU ARE USING SAFE UPDATE MODE AN,本文是在MySQL Workbench的環(huán)境操作,需要的朋友可以參考下2014-11-11
Apache Drill 連接 MySQL 或 PostgreSQL&
Drill 連接 MySQL或PostgreSQL 數(shù)據(jù)庫需要通過配置JDBC存儲插件實現(xiàn),核心是通過JDBC 驅(qū)動連接外部數(shù)據(jù)庫,下面給大家介紹Apache Drill 連接 MySQL 或 PostgreSQL 數(shù)據(jù)庫的詳細(xì)步驟,感興趣的朋友跟隨小編一起看看吧2025-11-11
通過實例學(xué)習(xí)MySQL分區(qū)表原理及常用操作
我們試著想一想, 在生產(chǎn)環(huán)境中什么最重要? 我感覺在生產(chǎn)環(huán)境中應(yīng)該沒有什么比數(shù)據(jù)跟更為重要. 那么我們該如何保證數(shù)據(jù)不丟失、或者丟失后可以快速恢復(fù)呢?只要看完這篇大家應(yīng)該就能對MySQL中數(shù)據(jù)備份有一定了解2019-05-05
MySQL系列關(guān)于NUll值的經(jīng)驗總結(jié)分析教程
這篇文章主要為大家介紹了MySQL系列關(guān)于NUll值的一些經(jīng)驗總結(jié)分析,關(guān)于null值的影響作用以及為什么會出現(xiàn)null值的原因等等問題的解析2021-10-10

