`
xm_koma
  • 浏览: 384761 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL增加Sequence管理功能

阅读更多

项目应用中,曾有以下一个场景:

接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。

所以想到了利用一个独立的自增的sequence来解决该问题。

当前数据库为:mysql

由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下:

第一步:创建--Sequence 管理表

DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
         name VARCHAR(50) NOT NULL,
         current_value INT NOT NULL,
         increment INT NOT NULL DEFAULT 1,
         PRIMARY KEY (name)
) ENGINE=InnoDB;

 

第二步:创建--取当前值的函数

DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
         RETURNS INTEGER
         LANGUAGE SQL
         DETERMINISTIC
         CONTAINS SQL
         SQL SECURITY DEFINER
         COMMENT ''
BEGIN
         DECLARE value INTEGER;
         SET value = 0;
         SELECT current_value INTO value
                   FROM sequence
                   WHERE name = seq_name;
         RETURN value;
END
$
DELIMITER ;

 

第三步:创建--取下一个值的函数

DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
         RETURNS INTEGER
         LANGUAGE SQL
         DETERMINISTIC
         CONTAINS SQL
         SQL SECURITY DEFINER
         COMMENT ''
BEGIN
         UPDATE sequence
                   SET current_value = current_value + increment
                   WHERE name = seq_name;
         RETURN currval(seq_name);
END
$
DELIMITER ;

 

第四步:创建--更新当前值的函数

DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
         RETURNS INTEGER
         LANGUAGE SQL
         DETERMINISTIC
         CONTAINS SQL
         SQL SECURITY DEFINER
         COMMENT ''
BEGIN
         UPDATE sequence
                   SET current_value = value
                   WHERE name = seq_name;
         RETURN currval(seq_name);
END
$
DELIMITER ;

 

第五步:测试函数功能

当上述四步完成后,可以用以下数据设置需要创建的sequence名称以及设置初始值和获取当前值和下一个值。

 

INSERT INTO sequence VALUES ('TestSeq', 0, 1);----添加一个sequence名称和初始值,以及自增幅度
SELECT SETVAL('TestSeq', 10);---设置指定sequence的初始值
SELECT CURRVAL('TestSeq');--查询指定sequence的当前值
SELECT NEXTVAL('TestSeq');--查询指定sequence的下一个值

 

 

在java代码中,可直接创建sql语句查询下一个值,这样就解决了流水号唯一的问题。

贴出部分代码(已测试通过)

	public void testGetSequence() {
		Connection conn = JDBCUtils.getConnection(url, userName, password);
		String sql = "SELECT CURRVAL('TestSeq');";
		PreparedStatement ptmt = null;
		ResultSet rs = null;
		try {
			ptmt = conn.prepareStatement(sql);
			rs = ptmt.executeQuery();
			int count = 0;
			while (rs.next()) {
				count = rs.getInt(1);
			}
			System.out.println(count);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtils.close(rs, ptmt, conn);
		}
	}

 

 

ps:在应用中,还有一种用java代码去实现模拟自增sequence的方式,具体思路是创建一张存放sequence的table,然后通过java调用sql语句去查询和修改这个table中指定sequence名称的值,这种方式请加上synchronized。具体代码这里就不上传了,因为实现了,未去测试过。

分享到:
评论
1 楼 zhaojundabing 2015-08-19  
很好的教程,学习了。
但是请问在mysql中建function,是不是没法做到像sychronized这样处理并发问题?

相关推荐

    java通过Mysql实现类似oracle序列功能序列.rar

    在MySQL中,定义一个存储过程如`GET_NEXT_SEQUENCE`,它会查询`sequence`表的最新`id`并增加1。 5. **Java调用存储过程**: - 使用`CallableStatement`对象,你可以调用MySQL的存储过程。设置参数和获取结果集,...

    MySQL的PPT文档

    - **MyISAM**:作为MySQL的默认引擎,提供了更多的索引和字段管理功能,支持表锁定机制来优化并发读写操作。但需要定期运行`OPTIMIZE TABLE`命令来回收空间,并且无法在表损坏后恢复数据。 - **HEAP**:适用于完全...

    Python库 | django_mysql-3.7.1-py3-none-any.whl

    对于后端开发人员来说,`django_mysql`不仅简化了Django与MySQL的集成,还通过增加额外的功能,使得在项目中使用MySQL变得更加灵活和高效。使用这个库,开发者可以更好地利用MySQL的特性,同时保持Django的优雅和...

    韩顺平j2ee-JDBC与MySQL学习笔记

    2. 将数据库驱动包(如MySQL的JDBC驱动)添加到项目的类路径中 为了演示JDBC的基本使用,我们可以通过一个简单的例子来了解。假设我们已经在Oracle数据库中创建了一个名为"user1"的表,包含id(主键,自增长)、...

    mysql_1.pdf

    - **添加新用户**: 需要在MySQL数据库的user表中插入新记录。例如: `CREATE USER 'briup'@'%' IDENTIFIED BY 'briup';`(允许任意主机连接) - **激活用户**: 执行 `FLUSH PRIVILEGES;` 来使用户权限生效。 - **设置...

    Oracle与MySQL的几点区别.docx

    Oracle 和 MySQL 是两种广泛使用的数据库管理系统,它们在很多方面有着显著的不同。以下是对标题和描述中提到的一些关键知识点的详细解释: 1. **组函数的使用**: - 在 MySQL 中,组函数(如 COUNT、SUM 等)可以...

    MariaDB 新版本实力逆袭不仅仅是 MySQL 替代品

    MariaDB,作为MySQL的一个分支,是由开源社区维护的数据库管理系统,采用GPL授权,旨在提供一个与MySQL兼容但更具创新性的选项。随着MariaDB 10.0的发布,它不仅被视为MySQL的替代品,更是对MySQL技术的进一步提升。...

    Sequence-Databases:用于创建和存储蛋白质 DNA 序列数据库的存储库

    总之,"Sequence-Databases"项目是一个综合性的解决方案,它结合了Python的灵活性和生物信息学的需求,旨在为科研人员提供一个高效、易用的序列数据库管理系统。通过学习和理解这个项目,我们可以深入探索序列数据...

    oracle数据库的功能

    5. **MySQL**:开源的关系型数据库管理系统,适用于小型到中型企业。易于安装和使用,拥有庞大的社区支持。 通过以上内容可以看出,Oracle数据库提供了丰富的功能和支持,使得其在企业级应用中占据了重要的地位。...

    专题23:Mysql 面试题(卷王专供+ 史上最全 + 2023面试必备)-V106-from-尼恩Java面试宝典.pdf

    MySQL日志管理 - **WAL (Write-Ahead Logging)**: - 一种日志先写机制,确保事务提交之前先将日志写入磁盘。 - 提高事务的持久性。 - **LSN (Log Sequence Number)**: - 日志序列号,用于标识日志记录的位置。 ...

    酒店管理系统

    数据库是存储和管理数据的核心组件,酒店管理系统通常采用关系型数据库,如MySQL或SQLite。数据库设计包括数据表的创建、字段定义和关系建立。例如,可以有"客户"表、"房间"表和"预订"表,它们之间通过主外键关联。...

    成绩管理系统需求分析.docx

    学生成绩管理系统的主要目标是高效、准确地管理学生的考试成绩,提供成绩录入、查询、统计和分析等功能。在需求分析阶段,首先要明确系统的目标用户,包括教师、学生、教务管理人员,以及可能的家长。对于教师,系统...

    AliSQL数据库开源功能特性.pdf

    阿里云的AliSQL数据库是一个基于MySQL的开源分支,旨在提供更高效、稳定和安全的数据存储解决方案。自2016年10月正式开源以来,AliSQL已经在社区中获得了广泛的关注和支持,其设计理念是回馈开源社区,从社区中汲取...

    mysql的增删改查总结面经.docx

    MySQL是世界上最流行的开源关系型数据库管理系统之一,其核心功能包括数据的增、删、改、查(CRUD)。本文将详细解析这些基本操作以及相关的数据库管理知识。 **增(Create)** - 插入数据:`INSERT INTO tab_name ...

    StrutsNews

    7.应要求添加了分页功能。 8.程序交流QQ:88190738,mail:ck-0123@163.com 作者:灵气 数据库表: create table news( newsid number primary key, title varchar2(20), content varchar2(1000), createdate ...

    Hive4——HIVE元数据库.pdf

    2. **ID管理**:Hive的`SEQUENCE_TABLE`暴露了对象ID的生成机制,每次创建新对象时,会更新ID并增加一定值。这与传统RDBMS的内部对象ID生成方式有所不同,后者通常对用户隐藏。 3. **数据字典**:Hive的数据字典...

    Mycat-server-1.6-RELEASE-20161028204710-linux.tar

    此外,Mycat还具备事务管理、SQL解析、安全控制等功能,兼容MySQL协议,因此可以无缝对接大部分使用MySQL的应用。 Mycat的标签“linux”表明了其在Linux环境下的适用性,而“Mycat”标签则明确了讨论的主题。在实际...

    循环向数据库添加数据

    - **使用批处理插入**:某些数据库支持一次插入多行数据的语法,如MySQL的`INSERT ... VALUES (...), (...), ...`。 - **并行处理**:利用多线程或多进程同时执行数据插入,但需注意数据一致性和并发控制。 综上所...

    关于oracleIP

    在Oracle数据库中,并不像MySQL那样直接支持自增字段的功能。但在实际的应用场景中,自增字段是非常有用的,尤其是在为表中的记录自动分配唯一标识符的情况下。因此,本文将详细介绍如何通过索引和触发器在Oracle...

Global site tag (gtag.js) - Google Analytics