--仿照序列表
drop table if exists sequence;   
create table sequence (   
    seq_name        VARCHAR(50) NOT NULL,
    current_val     INT         NOT NULL,
    increment_val   INT         NOT NULL    DEFAULT 1,
PRIMARY KEY (seq_name)   
);
-- 增加序列 
INSERT INTO sequence(seq_name,current_val,increment_val) VALUES ('SEQ_R_USER',1,1);
INSERT INTO sequence(seq_name,current_val,increment_val) VALUES ('SEQ_R_ROLE',1,1);
INSERT INTO sequence(seq_name,current_val,increment_val) VALUES ('SEQ_TB_GARAGE',1,1);
INSERT INTO sequence(seq_name,current_val,increment_val) VALUES ('SEQ_TB_CUSTOM',1,1);
INSERT INTO sequence(seq_name,current_val,increment_val) VALUES ('SEQ_TB_FIX',1,1);
INSERT INTO sequence(seq_name,current_val,increment_val) VALUES ('SEQ_TB_PARTS',1,1);
 
-- 当前序列值
DROP FUNCTION IF EXISTS `currval`;
create function currval(v_seq_name VARCHAR(50))   
returns integer  
begin  
    declare value integer;   
    set value = 0;   
    select current_val into value   
    from sequence  
    where seq_name = v_seq_name;   
    return value;   
end;

-- 下一个序列值 nextval 需要commit之后才会更新到表中。
DROP FUNCTION IF EXISTS `nextval`;
create function nextval (v_seq_name VARCHAR(50))   
returns integer  
begin
DECLARE t_error INTEGER DEFAULT 0;  
DECLARE EXIT HANDLER FOR SQLEXCEPTION return -1;
  update sequence
  set current_val = current_val + increment_val
  where seq_name = v_seq_name;
  return currval(v_seq_name);
end;
/*
-- 设值 setval
DROP FUNCTION IF EXISTS `setval`;
create function setval(v_seq_name VARCHAR(50), v_new_val INTEGER)   
returns integer  
begin  
  update sequence  
  set current_val = v_new_val   
  where seq_name = v_seq_name;   
return currval(v_seq_name);
end;
*/
-- 测试
-- select setval('SEQ_R_USER',0);
select currval('SEQ_R_USER');
select nextval('SEQ_R_USER');

-- 事物 并发  关闭自动commit后用两个窗口测试
select nextval('SEQ_R_USER');
select nextval('SEQ_R_USER');
 
-- show function status;

-- 获取序列值的存储过程 p_nextval
DROP PROCEDURE IF EXISTS p_nextval;  
CREATE PROCEDURE p_nextval(IN v_seq_name VARCHAR(50),OUT o_retsult VARCHAR(50)) 
BEGIN
 DECLARE EXIT HANDLER FOR SQLEXCEPTION 
 BEGIN
  ROLLBACK;
  SET o_retsult=-1;
 END;  
 START TRANSACTION;  
  update sequence
  set current_val = current_val + increment_val
  where seq_name = v_seq_name;
  set o_retsult= currval(v_seq_name);
 COMMIT;
END;

-- -- END 仿照序列表
----------------------------------
-- 使用
select * from sequence;
call p_nextval('SEQ_R_USER',@o_result);
select @o_result
 
-------------------------------------------------------

-- java jdbc调用
-------------------------------------------------------

java jdbc这么调用;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;

public class TestMysqlProcedure {
public static void main(String[] args) throws Exception {
Connection cnn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
cnn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/xx", "root",
"passswordxxxx");
int status = -1;
CallableStatement cs = cnn.prepareCall("{ call p_nextval (?,?) }");
int pos = 0;
cs.setString(++pos, "nnid");
cs.registerOutParameter(++pos, java.sql.Types.INTEGER);
cs.execute();
status = cs.getInt(2);
System.out.println(status);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cnn != null) {
cnn.close();
}
}
}
}

-------------------------------------------------------------

ibatis这么用:

/**
     * 获取序列
     * @param seq
     * @return
     */
    public String getSequenceByProcedure(String seq)
    {
        try
        {
            HashMap<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("v_seq_name", seq);
            paramMap.put("o_ret", "");
            updateObject("getNextval", paramMap);
            return String.valueOf(paramMap.get("o_retsult"));
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
        return -1l;
    }

xml中配置:

<parameterMap class="java.util.Map" id="seqNameParameters"> 
<parameter property="v_seq_name" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
<parameter property="o_retsult" javaType="java.lang.String" jdbcType="VARCHAR" mode="OUT" />
</parameterMap>
<procedure id="getNextval" parameterMap="seqNameParameters">
{call p_nextval(?, ?)}
</procedure>

并发安全的mysql序列实现相关推荐

  1. mysql序列increment_MySQL 序列 AUTO_INCREMENT

    MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列 ...

  2. 并发场景下MySQL存在的问题及解决思路

    转载自 并发场景下MySQL存在的问题及解决思路 目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 一.背景 对于数据 ...

  3. 删除行对MySQL序列有这么多影响?

    墨墨导读:MySQL序列概述为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号.交易流水号等. 一.MySQL序列概述 为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号. ...

  4. 雷林鹏分享:MySQL 序列使用

    MySQL 序列使用 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如 ...

  5. MySQL 序列使用

    MySQL 序列是一组整数:1, 2, 3, -,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列. ...

  6. mysql重复记录大于十的数据库_MySQL专题10之MySQL序列使用、MySQL处理重复数据、MySQL以及SQL的注入...

    1.MySQL序列使用 -  MySQL序列是一组整数:1,2,3...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. -  使用AUTO ...

  7. 第30章 MySQL 序列使用教程

    MySQL 序列是一组整数:1, 2, 3, -,由于一张数据表只能有一个字段自增主键, 如果仁兄想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章咱们将介绍如何使用MySQL的序列 ...

  8. 高并发Nginx,Tomcat8,mysql数据库配置

    一.前言 因为公司需要,所以在不断尝试使用JMeter压力测试工具中,遇到了一些高并发的问题,以及一些坑,在此记录一下,在此说明一下本人是Java开发程序员. 二.Nginx配置 1.worker_p ...

  9. mysql并发 node_nodejs下mysql性能测试

    By 2011 年 02 月 14 日 本文为原创文章,出自http://cnodejs.org,转载请注明出处和作者 作者:qingdu 原文:http://cnodejs.org/blog/?p= ...

最新文章

  1. jQuery校验 jQuery Validate 表单验证详解
  2. TensorFlow:Object_Detection_API在Windows10上的配置
  3. linux c 用户态 调试追踪函数 调用堆栈 定位段错误
  4. docker安装elasticsearch和kibana
  5. SAP自定义查询工具SQVI
  6. 提前(qian)庆祝 “1024程序员节” ,价值 1500 元的京东卡免费送!
  7. chromium浏览器_微软将全面向Windows 10用户推送Chromium版Edge浏览器
  8. asp.net写入日志到文本文件
  9. 前端学习(2137):webpack的介绍和安装
  10. 浅谈长连接的平滑重启
  11. Android图片缩放方法
  12. C#中Thread.sleep()
  13. Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
  14. JAVA中数字转大写字母_java实现数字转大写
  15. 基于C++和opengl实现太阳系动画演示系统 课程论文+项目源码
  16. java群面自我介绍,群面的一分钟自我介绍
  17. 科目二考试全流程详解
  18. 国税局发票查验API接口文档说明
  19. STO不会火,比特大陆不会死,币安会去非洲:区块链行业的63个预测
  20. 边缘计算(二)——边缘计算的类型与用途

热门文章

  1. WSDM2021 | 多交互注意力网络用于CTR预估中细粒度特征学习
  2. 【白皮书分享】2020新式茶饮白皮书:数字化进阶-奈雪.pdf(附下载链接)
  3. 【报告分享】2019-2020年企业调薪参考手册.pdf(附下载链接)
  4. 【报告分享】2019年中国首席营销官(CMO)调查白皮书.pdf(附下载链接)
  5. 虚拟机和实体服务器怎样连接,服务器实体机与虚拟机
  6. 遍历界面控件 android,Android 判断所有字段是否已经输入的实例
  7. unity如何得到所有子对象_Unity用户手册-Mesh合批
  8. CCF 2018-3-1跳一跳
  9. Java基础(七)——文件、IO流
  10. 关于利用np.contour画出logistic模型决策边界(plot_decision_regions)的一点感想