Mysql自定义序列数的实现

一、前言

往往有很多情况下,我们需要使用自己生成的唯一Id或保证不重复的序列号,特别是在高并发的场景下。为此,很容易想到的实现方式有以下两种:

  • 要么使用能保证分布式高并发下一致性的组件Zookeeper,借助于它的分布式锁很容易实现,缺点是需要在自己的系统或服务中引入Zookeeper的组件依赖,无疑增加了系统复杂度和可维护性(换用Redis也是同理);
  • 另一种容易想到可以利用Mysql的事务操作,存储过程是可以满足事务性的要求,所以这种方式相比于第一种方式更加轻量。

这里介绍采用自定义Mysql序列数的方式来生成唯一Id。

二、创建序列表

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

三、插入定义的序列

INSERT INTO sequence VALUES ('seq1', 0, 1);
INSERT INTO sequence VALUES ('seq2', 0, 1);
...

四、自定义函数实现

DROP FUNCTION IF EXISTS `seq`;  
DELIMITER $$  
CREATE FUNCTION `seq`(seq_name char (20)) returns BIGINT
BEGIN
  UPDATE sequence SET current_value=last_insert_id(current_value + increment) WHERE name=seq_name;
  RETURN last_insert_id();
END $$
DELIMITER ;

五、Mybatis中调用函数来获取最新序列数

<select id="getRowkeyByName" parameterType="java.lang.String" resultType="long">
    select `seq`(
        #{name}
    )
</select>

以上。

发布了62 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/songzehao/article/details/102900940