设为首页 加入收藏

TOP

自增序列产生器的实现思路
2014-11-24 03:26:08 来源: 作者: 【 】 浏览:2
Tags:序列 产生 实现 思路

自增序列产生器的实现思路
l 需求
u 实现MySQL自带的字段值自动增长等效的功能;
u 同一应用集群中 数据库表的自增类型字段值具有全局唯一性;
u 支持数据库级别的水平拆分表,同时还需要支持数据库内部的水平拆分表,其ID值都来源于同一条配置记录; www.2cto.com
l 存储设计
序列产生器配置表increment_config结构:
列名称 数据类型 是否为空 默认值 是否自增 主键/索引 备注
ID INT UNSIGNED N AUTO_INCREMENT PRIMARY KEY(ID) 唯一标示,无意义
TABLE_NAME VARCHAR(40) N UNIQUE INDEX 表名称
TABLE_TOTAL TINYINT UNSIGNED N 0 标记数据库内分表的数量
COLUMN_NAME VARCHAR(40) N 字段名称
START_VALUE BIGINT UNSIGNED N 1 开始值
OFFSET_VALUE SMALLINT UNSIGNED N 10000 增长的步长
FLAG TINYINT N 0 0–正常;1–作废值
GMT_MODIFIED TIMESTAMP N 数据库自动更新此值
备注:
1>. GMT_MODIFIED不由程序或人为主动去负责更新与填写,而是通过数据库的特性自动填写与更新;
2>. 对于数据库内部的水平分表,即TABLE_TOTAL<>0,则通过TABLE_NAME+TABLE_TOTAL组合区分;
l 对存储表的操作 www.2cto.com
u 初始化的 SQL
对于需要用到序列产生器的表,则在此配置表中增加一条记录,例如:
INSERT INTO(TABLE_NAME,TABLE_TOTAL,COLUMN_NAME,START_VALUE,OFFSET_VALUE,FLAG)
VALUES(‘msg_’,23, ’MSG_ID’,1,10000,0);
u 序列生成器操作的 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,处理步骤如下: www.2cto.com
1>. 挂起当前的序列调用请求;
2>. 做序列区间值获取的事务;
3>. 把新获得区间值的START_VALUE,给予挂起的调用请求;
总结:每个区间值的最大值(END_VALUE)始终作为当前期间的弃用值。
作者 snoopy7713
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MSSqlServer伪序列 下一篇mysql添加用户

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 C 语言或者限制使 (2025-12-25 08:50:05)
·C++构造shared_ptr为 (2025-12-25 08:50:01)
·既然引用计数在做 GC (2025-12-25 08:49:59)
·Java 编程和 c 语言 (2025-12-25 08:19:48)
·. net内存管理宝典这 (2025-12-25 08:19:46)