自增序列产生器的实现思路

l   需求

u  实现MySQL自带的字段值自动增长等效的功能;

u  同一应用集群中数据库表的自增类型字段值具有全局唯一性;

u  支持数据库级别的水平拆分表,同时还需要支持数据库内部的水平拆分表,其ID值都来源于同一条配置记录;

l   存储设计

序列产生器配置表increment_config结构:

列名称数据类型是否为空默认值是否自增主键/索引备注
IDINT UNSIGNEDNAUTO_INCREMENTPRIMARY KEY(ID)唯一标示,无意义
TABLE_NAMEVARCHAR(40)NUNIQUE INDEX表名称
TABLE_TOTALTINYINT UNSIGNEDN0标记数据库内分表的数量
COLUMN_NAMEVARCHAR(40)N字段名称
START_VALUEBIGINT UNSIGNEDN1开始值
OFFSET_VALUESMALLINT UNSIGNEDN10000增长的步长
FLAGTINYINTN00–正常;1–作废值
GMT_MODIFIEDTIMESTAMPN数据库自动更新此值

备注:

1>. GMT_MODIFIED不由程序或人为主动去负责更新与填写,而是通过数据库的特性自动填写与更新;

2>. 对于数据库内部的水平分表,即TABLE_TOTAL<>0,则通过TABLE_NAME+TABLE_TOTAL组合区分;

l   对存储表的操作

初始化的 SQL

对于需要用到序列产生器的表,则在此配置表中增加一条记录,例如:

INSERT INTO(TABLE_NAME,TABLE_TOTAL,COLUMN_NAME,START_VALUE,OFFSET_VALUE,FLAG)

VALUES(‘msg_’,23, ’MSG_ID’,1,10000,0);

序列生成器操作的 SQL

程序每次获得序列区间段,以及更新相关数据值操作的事务的过程SQL,假设msg_系列表对应的记录,在配置表中ID=1。

START  TRNSACTION;

SELECT  ID, TABLE_NAME,COLUMN_NAME,START_VALUE,START_VALUE+OFFSET_VALUE AS END_VALUE

FROM  increment_config  WHERE ID=1 FOR UPDATE;

UPDATE  increment_config  SET  START_VALUE=START_VALUE+OFFSET_VALUE WHERE  ID=1;

COMMIT;

l   程序实现建议

u  为提供序列产生的速度,而提高业务处理的性能。程序需要以拿序列区间的方式实现,而不是每次需要的时候,都要去数据库获得序列号值;

u  程序在每次启动的时候,要初始化配置表中所有有效记录的序列区间值;

u  当程序拿到的区间值START_VALUE,经过一段时间使用后达到:START_VALUE=END_VALUE,处理步骤如下:

1>. 挂起当前的序列调用请求;

2>. 做序列区间值获取的事务;

3>. 把新获得区间值的START_VALUE,给予挂起的调用请求;

总结:每个区间值的最大值(END_VALUE)始终作为当前期间的弃用值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值