一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - mysql+mybatis實現(xiàn)存儲過程+事務(wù) + 多并發(fā)流水號獲取

mysql+mybatis實現(xiàn)存儲過程+事務(wù) + 多并發(fā)流水號獲取

2022-02-16 18:55旋轉(zhuǎn)的夢 Mysql

這篇文章主要介紹了mysql+mybatis+存儲過程+事務(wù) + 多并發(fā)流水號獲取,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

數(shù)據(jù)庫存儲過程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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

流水號表

?
1
2
3
4
5
6
7
8
9
10
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配置

?
1
2
3
4
5
6
7
8
9
10
11
<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>

測試代碼

?
1
2
3
4
5
@Override
    public Map<String, Object> generateSerialNumber(Map<String, Object> param) {
        sysSerialNumberMapper.generateSerialNumber(param);
        return param;
    }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/cocoat/p/5808684.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 桃乃木香奈作品在线 | 国产999在线观看 | 男人操男人 | adc 我们的永久网址 | 娇妻在床上迎合男人 | 亚洲成人免费观看 | 小sao货ji巴cao死你视频 | 四虎影视4hu最新地址在线884 | 为什么丈夫插我我却喜欢被打着插 | 亚洲欧美综合区自拍另类 | 强波多野结衣女教师 | 午夜精品久久久久久久99蜜桃i | 国产91在线精品 | 亚洲精品在看在线观看 | 男人的视频网站 | 91精品国产综合久久香蕉 | 欧美高清在线精品一区二区不卡 | 被强迫变性翘秘书 | 精品国产一区二区三区久久久蜜臀 | 无颜之月全集免费观看 | 婷婷伊人综合亚洲综合网 | 亚洲精品国产SUV | 午夜久久免费视频 | 精品视频在线观看免费 | 男人天堂久久 | 免费全看男女拍拍拍的视频 | 玩两个少妇女邻居 | ai换脸杨幂被c在线观看 | 国产男女乱淫真视频全程播放 | 日韩免费视频一区 | 范冰冰a级一级特级毛片 | 国产综合久久 | 边摸边吃奶边做爽gif动态图 | 俄罗斯15一16处交 | 暖暖的视频完整视频韩国免费 | 深夜视频免费看 | 成人看片免费无限观看视频 | 久久久亚洲国产精品主播 | 国产激情一区二区三区成人91 | 国产在线视频第一页 | 国产一区风间由美在线观看 |