并发安全的mysql序列实现
--仿照序列表
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序列实现相关推荐
- mysql序列increment_MySQL 序列 AUTO_INCREMENT
MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列 ...
- 并发场景下MySQL存在的问题及解决思路
转载自 并发场景下MySQL存在的问题及解决思路 目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 一.背景 对于数据 ...
- 删除行对MySQL序列有这么多影响?
墨墨导读:MySQL序列概述为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号.交易流水号等. 一.MySQL序列概述 为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号. ...
- 雷林鹏分享:MySQL 序列使用
MySQL 序列使用 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如 ...
- MySQL 序列使用
MySQL 序列是一组整数:1, 2, 3, -,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列. ...
- mysql重复记录大于十的数据库_MySQL专题10之MySQL序列使用、MySQL处理重复数据、MySQL以及SQL的注入...
1.MySQL序列使用 - MySQL序列是一组整数:1,2,3...,由于一张数据表只能有一个字段自增主键,如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. - 使用AUTO ...
- 第30章 MySQL 序列使用教程
MySQL 序列是一组整数:1, 2, 3, -,由于一张数据表只能有一个字段自增主键, 如果仁兄想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章咱们将介绍如何使用MySQL的序列 ...
- 高并发Nginx,Tomcat8,mysql数据库配置
一.前言 因为公司需要,所以在不断尝试使用JMeter压力测试工具中,遇到了一些高并发的问题,以及一些坑,在此记录一下,在此说明一下本人是Java开发程序员. 二.Nginx配置 1.worker_p ...
- mysql并发 node_nodejs下mysql性能测试
By 2011 年 02 月 14 日 本文为原创文章,出自http://cnodejs.org,转载请注明出处和作者 作者:qingdu 原文:http://cnodejs.org/blog/?p= ...
最新文章
- jQuery校验 jQuery Validate 表单验证详解
- TensorFlow:Object_Detection_API在Windows10上的配置
- linux c 用户态 调试追踪函数 调用堆栈 定位段错误
- docker安装elasticsearch和kibana
- SAP自定义查询工具SQVI
- 提前(qian)庆祝 “1024程序员节” ,价值 1500 元的京东卡免费送!
- chromium浏览器_微软将全面向Windows 10用户推送Chromium版Edge浏览器
- asp.net写入日志到文本文件
- 前端学习(2137):webpack的介绍和安装
- 浅谈长连接的平滑重启
- Android图片缩放方法
- C#中Thread.sleep()
- Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
- JAVA中数字转大写字母_java实现数字转大写
- 基于C++和opengl实现太阳系动画演示系统 课程论文+项目源码
- java群面自我介绍,群面的一分钟自我介绍
- 科目二考试全流程详解
- 国税局发票查验API接口文档说明
- STO不会火,比特大陆不会死,币安会去非洲:区块链行业的63个预测
- 边缘计算(二)——边缘计算的类型与用途
热门文章
- WSDM2021 | 多交互注意力网络用于CTR预估中细粒度特征学习
- 【白皮书分享】2020新式茶饮白皮书:数字化进阶-奈雪.pdf(附下载链接)
- 【报告分享】2019-2020年企业调薪参考手册.pdf(附下载链接)
- 【报告分享】2019年中国首席营销官(CMO)调查白皮书.pdf(附下载链接)
- 虚拟机和实体服务器怎样连接,服务器实体机与虚拟机
- 遍历界面控件 android,Android 判断所有字段是否已经输入的实例
- unity如何得到所有子对象_Unity用户手册-Mesh合批
- CCF	2018-3-1跳一跳
- Java基础(七)——文件、IO流
- 关于利用np.contour画出logistic模型决策边界(plot_decision_regions)的一点感想